我有一个表中有200条记录,其中10条记录的文本中包含'TAX'字样。不喜欢,也不喜欢相反的结果
当我执行
Select * from tbl1 WHERE [TextCol] LIKE '%TAX%'
然后我得到的结果与10个记录设置正确。
但是,当我试图通过
Select * from tbl1 WHERE [TextCol] NOT LIKE '%TAX%'
它返回100所记录的,而不是190
我有一个表中有200条记录,其中10条记录的文本中包含'TAX'字样。不喜欢,也不喜欢相反的结果
当我执行
Select * from tbl1 WHERE [TextCol] LIKE '%TAX%'
然后我得到的结果与10个记录设置正确。
但是,当我试图通过
Select * from tbl1 WHERE [TextCol] NOT LIKE '%TAX%'
它返回100所记录的,而不是190
这样做是为了排除这些记录返回正确的结果?
Select * from tbl1 WHERE COALESCE([TextCol],'-1') NOT LIKE '%TAX%'
相信NULL
值是这里的问题,如果列包含它们,然后NULL NOT LIKE '%TAX%'
将返回UNKNOWN/NULL
,因此不会被选中。
我建议您阅读handling with NULL
values或here。
由于@ughai建议,如果性能是一个问题,你也可以使用:
Select * from tbl1
WHERE [TextCol] NOT LIKE '%TAX%'
OR [TextCol] IS NULL
Select * from tbl1
WHERE ([TextCol] NOT LIKE '%TAX%') AND ([TextCol] NOT LIKE '%TAX%')
select * from tbl1
where [TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL
'WHERE([TextCol]不是'%TAX%')和([TextCol]不是'%TAX%')'有什么意义? – moopet
虽然此代码片段可能会解决问题,包括解释[真的有帮助](// meta.stackexchange.com/q/114762)以提高您的帖子的质量。请记住,你正在为将来的读者回答这个问题,而不仅仅是现在问的人!请编辑您的答案以添加解释,并指出适用的限制和假设。 –
你需要检查NULL值,以及:
[TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL
这应该照顾空值的这也可能是为什么你没有得到输出中的所有行。
尽管此代码片段可能会解决问题,包括解释[真的有帮助](// meta.stackexchange.com/q/114762)以提高帖子的质量。请记住,你正在为将来的读者回答这个问题,而不仅仅是现在问的人!请编辑您的答案以添加解释,并指出适用的限制和假设。 –
(A) SQL比较运算符会产生三个可能的值:True,False和Unknown。如果一个或两个操作数是NULL
那么结果是未知。看看下面的例子,我们有一个恒定的(18)比较某些值(一个人的年龄):
21 >= 18 -- True
15 >= 18 -- False
NULL >= 18 -- Unknown
正如你所看到的,数据库可以/不会决定是否NULL
大于/等于18。
(B)数据库将只返回WHERE
子句计算结果为True的行。反转表达式(例如,WHERE age >= 18
更改为WHERE age < 18
)不会影响未知结果。可以使用IS [NOT] NULL
来匹配NULL
的值。下面的查询将选择其中列不匹配图案中的行或列是NULL:
WHERE [TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL
函数,如ISNULL
和COALESCE
可用于转化成NULL
一些值。
更正:涉及“NULL”值的所有操作都会导致**'UNKNOWN' ** ...,除非它们不包含'SELECT COUNT(TextCol)AS tally FROM tbl1' – onedaywhen
编辑'所有操作' - >'比较运算符'是好的+1 – onedaywhen
它发生在我身上呢!在破解我的头后,我发现它是因为空值,因此您可以使用此查询来避免它:
WHERE CASE WHEN [TextCol] IS NULL
THEN 'default'
ELSE [TextCol]
END NOT LIKE '%TAX%'
您是否具有该列的null值? – musefan
是的,该列中有空值 – Shanka
尽可能避免在搜索字符串的开头使用'%'。它很重。 –