我有一個表中有200條記錄,其中10條記錄的文本中包含'TAX'字樣。不喜歡,也不喜歡相反的結果
當我執行
Select * from tbl1 WHERE [TextCol] LIKE '%TAX%'
然後我得到的結果與10個記錄設置正確。
但是,當我試圖通過
Select * from tbl1 WHERE [TextCol] NOT LIKE '%TAX%'
它返回100所記錄的,而不是190
我有一個表中有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
,因此不會被選中。
我建議您閱讀handling with NULL
values或here。
由於@ughai建議,如果性能是一個問題,你也可以使用:
Select * from tbl1
WHERE [TextCol] NOT LIKE '%TAX%'
OR [TextCol] IS 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
'WHERE([TextCol]不是'%TAX%')和([TextCol]不是'%TAX%')'有什麼意義? – moopet
雖然此代碼片段可能會解決問題,包括解釋[真的有幫助](// meta.stackexchange.com/q/114762)以提高您的帖子的質量。請記住,你正在爲將來的讀者回答這個問題,而不僅僅是現在問的人!請編輯您的答案以添加解釋,並指出適用的限制和假設。 –
你需要檢查NULL值,以及:
[TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL
這應該照顧空值的這也可能是爲什麼你沒有得到輸出中的所有行。
儘管此代碼片段可能會解決問題,包括解釋[真的有幫助](// meta.stackexchange.com/q/114762)以提高帖子的質量。請記住,你正在爲將來的讀者回答這個問題,而不僅僅是現在問的人!請編輯您的答案以添加解釋,並指出適用的限制和假設。 –
(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
函數,如ISNULL
和COALESCE
可用於轉化成NULL
一些值。
更正:涉及「NULL」值的所有操作都會導致**'UNKNOWN' ** ...,除非它們不包含'SELECT COUNT(TextCol)AS tally FROM tbl1' – onedaywhen
編輯'所有操作' - >'比較運算符'是好的+1 – onedaywhen
它發生在我身上呢!在破解我的頭後,我發現它是因爲空值,因此您可以使用此查詢來避免它:
WHERE CASE WHEN [TextCol] IS NULL
THEN 'default'
ELSE [TextCol]
END NOT LIKE '%TAX%'
您是否具有該列的null值? – musefan
是的,該列中有空值 – Shanka
儘可能避免在搜索字符串的開頭使用'%'。它很重。 –