我有一个包含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
,因此不会被选中。
我建议您阅读有关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的行。反转表达式(例如将WHERE age >= 18
更改为WHERE age < 18
)不会影响Unknown结果。
您可以使用IS [NOT] NULL
来匹配NULL
值。下面的查询将选择列与模式不匹配或列为NULL的行:
WHERE [TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL
可以使用ISNULL
、COALESCE
等函数将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
我在简单的int列上使用IN
运算符时遇到了同样的问题。我发现它们并不像我想象的那样彼此相反。(我可以通过行数来判断)
select * from Dest where id in(select id from Source)
select * from Dest where id NOT in(select id from Source)
为了使它们相互转换,我不得不重写它们如下:
select * from Dest where isnull(id,-2) in(select isnull(id,-1) from Source)
select * from Dest where isnull(id,-2) NOT in(select isnull(id,-1) from Source)