SQL不喜欢 - 不工作

时间:2011-08-03 14:34:54

标签: sql tsql sql-server-2008

更新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不在一行中。

不确定我做错了什么。

6 个答案:

答案 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