2016-11-02 85 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%'