不喜欢和喜欢不返回相反的结果



我有一个包含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

可以使用ISNULLCOALESCE等函数将NULL转换成某个值

  1. Select * from tbl1 
    WHERE ([TextCol] NOT LIKE '%TAX%') AND ([TextCol] NOT LIKE '%TAX%')
    
  2. 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) 

最新更新