在 LIKE 条件中使用来自 table 变量的 select
Using select from a table variable in a LIKE condition
我有一个服务器日志文件,我正试图削减它以便于检查。我正在搜索的 table 只是将批量插入到名为 Spam.LogData 的单个列 table 中。这样做的一个重要部分是删除 activity 合法用户。我已经有一个语句可以通过解析日志中的特定行来提取需要删除的会话 ID。这是唯一始终在同一位置具有会话 ID 和电子邮件地址的行。然后我可以将会话 ID 读取到一个非常简单的 table 变量中。
declare @sessionid table (sesID int)
问题是使用此 table 中的数据创建类似语句以查找并删除必要的行。我认为这条语句将允许我 select 删除与这些会话 ID 关联的行,并通过将注释从删除翻转到 select,删除它们。
--delete
select *
from Spam.LogData
where data like '%' + (select 'session ' + cast(sesID as nvarchar) from @sessionid) + '%'
但是我收到错误:
Subquery returned more than 1 value. This is not permitted when the
subquery follows =, !=, <, <= , >, >= or when the subquery is used as
an expression.
最好的方法是什么?
也许您可以使用 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)
您需要在日志 table 中查找将 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
我有一个服务器日志文件,我正试图削减它以便于检查。我正在搜索的 table 只是将批量插入到名为 Spam.LogData 的单个列 table 中。这样做的一个重要部分是删除 activity 合法用户。我已经有一个语句可以通过解析日志中的特定行来提取需要删除的会话 ID。这是唯一始终在同一位置具有会话 ID 和电子邮件地址的行。然后我可以将会话 ID 读取到一个非常简单的 table 变量中。
declare @sessionid table (sesID int)
问题是使用此 table 中的数据创建类似语句以查找并删除必要的行。我认为这条语句将允许我 select 删除与这些会话 ID 关联的行,并通过将注释从删除翻转到 select,删除它们。
--delete
select *
from Spam.LogData
where data like '%' + (select 'session ' + cast(sesID as nvarchar) from @sessionid) + '%'
但是我收到错误:
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
最好的方法是什么?
也许您可以使用 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)
您需要在日志 table 中查找将 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