2012-04-20 67 views
1

我正在努力研究SQL查詢是如何運行的,並且遇到了一些絆腳石。查詢表達式優先級的SQL順序

如果where子句類似於下面使用:

A OR B和C

這可能意味着無論是下面

的(A或B)和C

A OR(B AND C)

在大多數情況下,結果將是相同的,但如果要查詢的集合僅包含{A},則第一個變體將返回空結果集,第二個將返回{A}。 SQL確實返回1結果。

有誰知道(或有鏈接)任何洞察力,這將幫助我瞭解如何構建查詢?

番茄醬

+0

燦」 t提供任何鏈接,但我相信它們是左聯想的。換句話說,(A或B)和C。爲了其他程序員(和你自己)的理智,請在這種情況下使用括號。 – Corbin 2012-04-20 10:15:30

+0

謝謝corbin,如果我正在寫它,我會,但是我們正在爲我們的內部網創建一個搜索功能,允許用戶使用「AND」,「OR」和「ANDNOT」運算符執行搜索條件,並且正在努力解決它應該如何編碼 – Ketchup 2012-04-20 10:17:39

+1

@Corbin:這是不正確的。 'AND'在SQL中具有比'OR'更高的優先級(不僅在SQL-Server中,而且在所有SQL方言中)。 – 2012-04-20 11:07:39

回答

2

的順序是以下根據MSDN

  1. 〜(按位NOT)

  2. (*)(乘),/(除法),% (+)(Positive), - (Negative),+(Add),(+ Concatenate), - (Subtract)((按位與),^(按位異或),| (按位或)

  3. =,>,<,> =,< =,<>,!=,!>,! <(比較運算符)

  4. NOT

  5. AND

  6. ALL,ANY,BETWEEN,IN,LIKE,或者,某些

  7. =(分配)

+0

謝謝Panayiotis,我認爲我的Google搜索失敗了,我無法找到它。 – Ketchup 2012-04-20 10:20:15

2

在知識(從文件),其AND有海格優先級比OR,你的目標應該是寫謂詞合取範式(「中AND條款一臺系列」)WHERE條款。

如果目的是

(A OR B) AND C 

那麼這樣寫它,一切都很好。

但是,如果目的是

A OR (B AND C) 

話,我建議您應用導致合取範式即

(P AND Q) OR R <=> (P OR R) AND (Q OR R)  

在你的情況distributive rewrite law

A OR (B AND C) <=> (A OR B) AND (A OR C)