在 LIKE 条件中使用从表变量中选择
Posted
技术标签:
【中文标题】在 LIKE 条件中使用从表变量中选择【英文标题】:Using select from a table variable in a LIKE condition 【发布时间】:2020-11-10 17:22:39 【问题描述】:我有一个服务器日志文件,我正在尝试削减它以便于检查。我正在搜索的表只是将批量插入到名为 Spam.LogData 的单列表中。这样做的一个重要部分是删除合法用户的活动。我已经有一个语句,可以通过解析日志中的特定行来提取需要删除的会话 ID。它是唯一始终将会话 ID 和电子邮件地址放在同一位置的行。然后我可以将会话 ID 读入一个非常简单的表变量。
declare @sessionid table (sesID int)
问题是使用此表中的数据创建一个like 语句以查找和删除必要的行。我认为该语句将允许我选择与这些会话 ID 关联的行,并将评论从删除翻转到选择,删除它们。
--delete
select *
from Spam.LogData
where data like '%' + (select 'session ' + cast(sesID as nvarchar) from @sessionid) + '%'
但是我得到了错误:
子查询返回超过 1 个值。这是不允许的,当 子查询遵循 =、!=、、>= 或当子查询用作 一个表达式。
最好的方法是什么?
【问题讨论】:
【参考方案1】:也许您可以使用 JOIN 代替子查询:
--delete LD
select LD.*
from Spam.LogData as LD
inner join @sessionid as S on LD.data like '%session ' + cast(S.sesID as nvarchar) + '%'
【讨论】:
这行不通。我需要在数据行中的某处专门搜索字符串“会话尝试使用 CTE。
我不确定您是如何获取要过滤的会话 ID 列表的,所以这是相当笼统的。
declare @yourVar varchar(64) = '12345678';
with CTE as (select sessionID from SessionTable
where sessionID like '%'+ @yourVar + '%')
select * from Spam.LogData
--delete Spam.LogData
where [data] in (select sessionID from CTE)
更新:Ryan,如果我理解您的评论,您的数据看起来与此类似。
declare @table table(val int, tID int identity)
insert into @table values( 1)
insert into @table values( 2)
insert into @table values( 5)
您需要在日志表中查找具有 int 值的记录作为字符串的一部分。 例如:session1、session2、session5 但不是 session3 或 session4
create table logData (sessionID varchar(50), misc varchar(24), id int identity )
insert into logData (sessionID, misc) values('session1', 'aaa')
insert into logData (sessionID, misc) values('session1','bbb')
insert into logData (sessionID, misc) values('session2', 'ccc')
insert into logData (sessionID, misc) values('session3', 'aaa')
insert into logData (sessionID, misc) values('session4','bbb')
insert into logData (sessionID, misc) values('session4', 'ccc')
insert into logData (sessionID, misc) values('session5', 'aaa')
insert into logData (sessionID, misc) values('session5','bbb')
不优雅,但它会完成工作。如果这没有帮助,您可以尝试查看光标。
确保您声明的带有会话值整数的@table 有一个标识列。
declare @pos int = 1, @last int, @val varchar(50)
select @last = max(tID) from @table
while ( @pos <= @last)
begin
select @val = cast(val as varchar) from @table where tID = @pos
select * from logData where sessionID like 'session%' + @val
set @pos = @pos+ 1
end
-- drop table logData
【讨论】:
这仅适用于单值变量。它不适用于表变量。表变量包含大约 400-600 个整数。我通过解析日志数据中的特定行来获取它们,该行恰好总是在同一位置具有 sessionID 和电子邮件地址。基本上是右(左(数据,17),4)。但是,要识别要删除的行,我需要在数据字符串中搜索“会话以上是关于在 LIKE 条件中使用从表变量中选择的主要内容,如果未能解决你的问题,请参考以下文章
从表 1 中选择某列并使用 Where 子句条件插入到表 2 中的某列
从表中选择或在 codeigniter 中的 where 和运算符中选择
如何在Oracle中添加一个策略,用户可以从表中选择所有数据,并且只能插入、更新、删除有条件的数据