我在存储过程中有以下代码。
WHERE
WPP.ACCEPTED = 1 AND
WPI.EMAIL LIKE '%@MATH.UCLA.EDU%' AND
(WPP.SPEAKER = 0 OR
WPP.SPEAKER IS NULL) AND
WPP.COMMENT NOT LIKE '%CORE%' AND
WPP.PROGRAMCODE = 'cmaws3'
NOT LIKE语句不起作用,是的,在任何人说任何事情之前,有些项目的COMMENT列不包含CORE,所有其他列都没问题。
有谁知道这有什么问题吗?
答案 0 :(得分:56)
如果WPP.COMMENT
包含NULL
,则条件不匹配。
此查询:
SELECT 1
WHERE NULL NOT LIKE '%test%'
将不会返回任何内容。
在NULL
列上,针对任何搜索字符串的LIKE
和NOT LIKE
都会返回NULL
。
请您发布您认为应退回的行的相关值,但不是吗?
答案 1 :(得分:6)
您的特定COMMENT列的值是否为空?
有时候,NOT LIKE不知道如何在空值周围正确行事。
答案 2 :(得分:5)
我刚遇到同样的问题,并解决了它,但在我找到这篇文章之前没有解决。看到你的问题没有得到真正的回答,这是我的解决方案(希望对你有用,或者其他任何人都在寻找我所做的同样的事情;
而不是;
... AND WPP.COMMENT NOT LIKE '%CORE%' ...
尝试;
... AND NOT WPP.COMMENT LIKE '%CORE%' ...
基本上移动“NOT”我正在评估的领域的另一边为我工作。
答案 3 :(得分:4)
刚刚遇到这个问题,答案很简单,请使用ISNULL
。如果您正在测试的字段在进行文本比较搜索时没有值(在某些记录中),SQL将不返回行,例如:
WHERE wpp.comment NOT LIKE '%CORE%'
因此,您已使用null
命令临时替换ISNULL
(空)记录中的值,例如
WHERE (ISNULL(wpp.comment,'')) NOT LIKE '%CORE%'
然后,这将显示所有具有空值的记录,并省略任何具有匹配条件的记录。如果你愿意,你可以在逗号中加入一些东西来帮助你记住,例如
WHERE (ISNULL(wpp.comment,'some_records_have_no_value')) NOT LIKE '%CORE%'
答案 4 :(得分:1)
mattgcon,
如果运行相同的SQL并注释掉“NOT LIKE”行,那么你应该得到更多的行吗?如果没有,请检查数据。我知道你在问题中提到过,但检查实际的SQL语句是否正在使用该子句。使用NULL的其他答案也是一个好主意。