2016-11-02 57 views
58

我有一个表中有200条记录,其中10条记录的文本中包含'TAX'字样。不喜欢,也不喜欢相反的结果

当我执行

Select * from tbl1 WHERE [TextCol] LIKE '%TAX%' 

然后我得到的结果与10个记录设置正确。

但是,当我试图通过

Select * from tbl1 WHERE [TextCol] NOT LIKE '%TAX%' 

它返回100所记录的,而不是190

+42

您是否具有该列的null值? – musefan

+0

是的,该列中有空值 – Shanka

+1

尽可能避免在搜索字符串的开头使用'%'。它很重。 –

回答

73

这样做是为了排除这些记录返回正确的结果?

Select * from tbl1 WHERE COALESCE([TextCol],'-1') NOT LIKE '%TAX%' 

相信NULL值是这里的问题,如果列包含它们,然后NULL NOT LIKE '%TAX%'将返回UNKNOWN/NULL,因此不会被选中。

我建议您阅读handling with NULL valueshere

由于@ughai建议,如果性能是一个问题,你也可以使用:

Select * from tbl1 
    WHERE [TextCol] NOT LIKE '%TAX%' 
    OR [TextCol] IS NULL 
+16

我会建议使用'[TextCol] NOT LIKE'%TAX%'或[TextCol] IS NULL',因为如果用户想要包含NULL值,它会有更好的性能 – ughai

+3

他说“190条记录”,所以我怀疑性能是一个问题,但无论如何编辑,因为其他人可能会阅读这个答案@ughai。 – sagi

+1

谢谢! NULL是问题。 – Shanka

1
  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 
    
+17

'WHERE([TextCol]不是'%TAX%')和([TextCol]不是'%TAX%')'有什么意义? – moopet

+4

虽然此代码片段可能会解决问题,包括解释[真的有帮助](// meta.stackexchange.com/q/114762)以提高您的帖子的质量。请记住,你正在为将来的读者回答这个问题,而不仅仅是现在问的人!请编辑您的答案以添加解释,并指出适用的限制和假设。 –

0

你需要检查NULL值,以及:

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

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

+3

尽管此代码片段可能会解决问题,包括解释[真的有帮助](// meta.stackexchange.com/q/114762)以提高帖子的质量。请记住,你正在为将来的读者回答这个问题,而不仅仅是现在问的人!请编辑您的答案以添加解释,并指出适用的限制和假设。 –

18

(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 

函数,如ISNULLCOALESCE可用于转化成NULL一些值。

+4

更正:涉及“NULL”值的所有操作都会导致**'UNKNOWN' ** ...,除非它们不包含'SELECT COUNT(TextCol)AS tally FROM tbl1' – onedaywhen

+0

编辑'所有操作' - >'比较运算符'是好的+1 – onedaywhen

2

它发生在我身上呢!在破解我的头后,我发现它是因为空值,因此您可以使用此查询来避免它:

WHERE CASE WHEN [TextCol] IS NULL 
      THEN 'default' 
      ELSE [TextCol] 
     END NOT LIKE '%TAX%'