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

我有一张有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 

函数如ISNULLCOALESCE可以用来将NULL转换成一些值。

它也发生在我身上呢! 打破了我的头后,我发现这是因为空值,所以你可以使用这个查询来避免它:

 WHERE CASE WHEN [TextCol] IS NULL THEN 'default' ELSE [TextCol] END NOT LIKE '%TAX%' 
  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 

您还需要检查NULL值:

  [TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL 

这也应该照顾空值,这可能是为什么你没有得到输出中的所有行。