不喜欢和不喜欢相反的结果
我有一张有200条logging的表格,其中10条logging的文字中含有“TAX”字样。
当我正在执行
Select * from tbl1 WHERE [TextCol] LIKE '%TAX%'
然后我正确地得到这10个logging的结果集。
但是,当我试图排除这些logging
Select * from tbl1 WHERE [TextCol] NOT LIKE '%TAX%'
它只返回100条logging,而不是190条。
这是否返回正确的结果?
Select * from tbl1 WHERE COALESCE([TextCol],'-1') NOT LIKE '%TAX%'
我相信NULL
值是这里的问题,如果列中包含它们,那么NULL NOT LIKE '%TAX%'
将返回UNKNOWN/NULL
,因此不会被选中。
我build议你阅读有关处理NULL
值 ,或在这里 。
正如@ughai所说,如果性能是一个问题,你也可以使用:
Select * from tbl1 WHERE [TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL
(A) SQL比较运算符产生三个可能的值:True,False和Unknown。 如果一个或两个操作数都是NULL
那么结果是Unknown。 考虑下面的例子,我们将一些值(一个人的年龄)与一个常数(18)进行比较:
21 >= 18 -- True 15 >= 18 -- False NULL >= 18 -- Unknown
正如你所看到的,数据库可以/不会决定NULL
是否大于/等于18。
(B)数据库将只返回WHERE
子句求值为True的行。 反转expression式(例如WHERE age >= 18
变为WHERE age < 18
)不影响未知结果。
您可以使用IS [NOT] NULL
来匹配NULL
值。 以下查询将select列与模式不匹配的行或列为NULL:
WHERE [TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL
函数如ISNULL
和COALESCE
可以用来将NULL
转换成一些值。
它也发生在我身上呢! 打破了我的头后,我发现这是因为空值,所以你可以使用这个查询来避免它:
WHERE CASE WHEN [TextCol] IS NULL THEN 'default' ELSE [TextCol] END NOT LIKE '%TAX%'
-
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
您还需要检查NULL值:
[TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL
这也应该照顾空值,这可能是为什么你没有得到输出中的所有行。