2017-02-23 47 views
1

我嘗試這樣做,有一個where子句,說明沒有匹配的2項的簡單查詢:MySQL查詢並不像一些文本匹配

where l.country not like \"%USA%\" or \"%CA%\" ORDER BY l.state 

我也試過:

where l.country not like \"%USA%\" or l.country not like \"%CA%\" ORDER BY l.state 

也嘗試過:

where l.country not like (\"%USA%\", \"%CA%\") ORDER BY l.state 

有沒有辦法使用「不喜歡」與多個匹配?

+0

是的,但它是基於正則表達式的較慢方法。目前出現什麼問題 – GurV

+1

您的實際邏輯是什麼?你想匹配沒有美國_和_ CA,美國_或_ CA的記錄嗎? –

回答

1

這是你的原始狀態:

where l.country not like "%USA%" or "%CA%" ORDER BY l.state 

我假設你打算這意味着「國既不是美國,也不CA」。

如果是的話,你會這樣寫:

where l.country not like '%USA%' and l.country not like '%CA%' ORDER BY l.state 

但有SQL中沒有語法NOT LIKE 'X' OR 'Y'。謂詞LIKE有一個左操作數和一個右操作數,不再有。

你寫的表達式是一個有效的表達式,但不會做你認爲它的作用。這就像,如果你這樣寫:

where (l.country not like "%USA%") or ("%CA%") ORDER BY l.state 

也就是說,兩個術語,由OR分離,首先是LIKE比較,第二個是隻是一個單一的字符串自身的文字。這是一個表達式中的有效術語,但它沒有任何用處。這就像寫作:

x = 6 * 8 + 0 

零表達有什麼影響?沒有。


更新:我錯了,我忽略了你寫的查詢的一個效果。你應該知道在一個布爾表達式中,如果你使用OR兩個術語,如果第二項總是TRUE,那麼第一項是什麼並不重要。

WHERE (some expression) OR (TRUE) 

這總是如此。

字符串'%CA%'計數爲真,因爲它不是空字符串或NULL。因此,在原來的查詢中,無論國家是什麼,WHERE子句都是正確的。

+0

謝謝你的回答和明確的解釋! – Sackling

1

你可以使用REGEXP與交替:

SELECT * 
FROM yourTable 
WHERE country NOT REGEXP '"%USA%"|"%CA%"' 

注:

你不需要逃避中出現的單引號字符串文本的內部雙引號。我認爲您的原始查詢不會運行,因爲您需要將使用LIKE的列與另一列或字符串文本進行比較,通常使用單引號。

REGEXP不區分大小寫,因此我們可以使用usaca獲得相同的結果,儘管在您的情況下這似乎不重要。