更新2:
在其中一行中,closed_by
列中包含null
。如果我用文本替换null,查询将开始工作,但它不适用于null
。所以似乎null
是问题,但查询应该返回null
行,因为pqr
不等于null
。
更新1:
我也试过set @user = 'pqr'
,但没有区别。它仍然返回0行,当它应该返回1行时,其中1行不包含pqr
。
原始问题:
我正在尝试返回不包含提供的ID的行:
declare @user varchar(3)
set @user = 'pqr'
select * from table1 where not( closed_by like @user )
closed_by包含
等数据abc,def,ghi,jkl,mno
但这没有给我任何错误并且没有返回任何数据,它应该返回一行,因为pqr
不在一行中。
不确定我做错了什么。
答案 0 :(得分:3)
您可能需要查看syntax of the LIKE
operator - 它会加入模式,因此您需要使用类似的内容:
declare @user varchar(5)
set @user = '%pqr%'
'%'是一个通配符,匹配任何zeor或更多chracters字符串。
仅供参考 - SQL Server将无法使用具有以通配符开头的LIKE模式的索引,因此您可能会发现您的查询在使用大型数据集时表现不佳。
答案 1 :(得分:2)
NULL
未知,因此不知道它是否与您的模式相似。您可以使用以下方法轻松解决此问题:
DECLARE @user VARCHAR(5) = '%pqr%';
SELECT ... WHERE COALESCE(closed_by, '') NOT LIKE @user;
事实上,你可能想要更准确:
DECLARE @user VARCHAR(7) = '%,pqr,%';
SELECT ... WHERE COALESCE(',' + closed_by + ',', '') NOT LIKE @user;
这样,如果您以后有像'trv,pqrs,ltt'
这样的数据,它就不会返回误报。
然而,说了所有这些,你考虑过以更规范化的方式存储它吗?存储以逗号分隔的列表可能非常有问题,我可以向您保证,这不会是您以这种方式处理数据时遇到的最后一个挑战。
答案 2 :(得分:1)
您需要包含通配符:
declare
@user varchar(5)
set @user = '%pqr%'
select *
from table1
where isnull(closed_by, '') not like @user
答案 3 :(得分:1)
使用LIKE时,您需要使用%
和_
通配符。没有它们,你实际上只有WHERE NOT (closed_by = @user)
。
另外,请注意意外比赛。例如,LIKE '%a%'
将匹配您的示例记录。对于这种情况,我倾向于确保逗号分隔列表在开头和结尾也有逗号。如; ',abc,def,ghi,jkl,mno,' LIKE '%,ghi,%'
但是,更重要的是,您正在使用关系数据库。每个条目都会更好,因为它在标准化结构中是自己的记录。虽然这给出了1:许多关系,而不是1:1的关系,但您可以获得INDEX的好处,并在查询中获得更大的灵活性。 (您的LIKE示例不能使用索引。)
回复更新2:
小心你假设NULL逻辑如何工作。
NULL LIKE '%pqr%'
的结果为NULL NOT (NULL)
的结果为NULL 您需要更改代码才能使用WHERE NOT (ISNULL(closed_by, '') LIKE '%pqr%')
答案 4 :(得分:0)
试试这个:
select * from table1 where closed_by not like @user
您可能需要添加适当的'%'字符来告诉SQL Server要搜索的值的哪个部分。例如'pqr%'
答案 5 :(得分:0)
听起来你真的在寻找等价,而不是通配符匹配。试试这个:
select * from table1 where closed_by <> @user