2015-04-24 36 views
0

我有一個表,如下所示:MySQL的:WHERE狀態NOT LIKE '%例如' 沒有返回NULL與狀態結果

+---------+----------+-----------------+ 
| name | age | status   | 
+---------+----------+-----------------+ 
| Clark | 25  | Example   | 
+---------+----------+-----------------+ 
| Peter | 28  | Example2  | 
+---------+----------+-----------------+ 
| Waldo | 37  | NULL   | 
+---------+----------+-----------------+ 
| Tarzan | 31  | Unknown   | 
+---------+----------+-----------------+ 

當我完成像這樣的查詢:

SELECT * FROM records WHERE status NOT LIKE 'example%' 

我得到:

+---------+----------+-----------------+ 
| name | age | status   | 
+---------+----------+-----------------+ 
| Tarzan | 31  | Unknown   | 
+---------+----------+-----------------+ 

如果我改變了查詢(請注意,我刪除了NOT):

SELECT * FROM records WHERE status LIKE 'example%' 

然後我得到如下:

+---------+----------+-----------------+ 
| name | age | status   | 
+---------+----------+-----------------+ 
| Clark | 25  | Example   | 
+---------+----------+-----------------+ 
| Peter | 28  | Example2  | 
+---------+----------+-----------------+ 

我的問題是:在哪裏金都?

回答

1

在SQL中,NULL值不能參加大多數比較操作,包括LIKE,而必須單獨使用IS NULL運營商考慮NULL值:

WHERE (`status` NOT LIKE '%example%' OR `status` IS NULL) 

這是愚蠢的,但這就是生活。

這被記錄在這裏:https://dev.mysql.com/doc/refman/5.7/en/working-with-null.html

不能使用[...]比較運算符如=,<,或者<>到測試NULL。由於任何與NULL比較的結果也是NULL,因此您無法從這種比較中獲得任何有意義的結果。

+0

啊,感謝@Dai,我確實已經知道答案了,只是試圖將它放在StackOverflow上,以便其他任何可能有問題的人,但是無論如何都要感謝您的正確答案!你鏈接的文檔討論的是比較運算符,但不是'LIKE',我認爲*是一個不同的構造。 – Bing

0

我不知道爲什麼MySQL的不喜歡處理LIKENULL值,但爲我工作溶液更改查詢到以下幾點:

SELECT * FROM records WHERE (status IS NULL OR status NOT LIKE 'example%') 

我無法找到任何關於這個問題的文檔,所以如果任何人有一些好東西請分享,但至少這個作品。

+0

這種行爲完全是由設計應該不會讓任何人感到驚訝。 NULL是一個沒有值的佔位符,並且不存在的值不能被恰當地表示爲*或者*或者不像任何其他值。表達式'1> NULL'是真的還是假的?答案是「不」。 (2,0,4)的平均值明顯是2,但(2,NULL,4)的平均值是3。 –

0

答案在three valued logicWHERE子句將僅篩選謂詞的計算結果爲TRUE的行。它將過濾出謂詞計算結果爲FALSENULL的行。由於null like somethingNULL它不會導致結果。