在 SQL 中,邏輯運算子「AND」和「OR」是建構條件表達式的基石,這些條件表達式會根據指定的條件過濾資料。但是,它們的優先級,或者說它們被評估的順序,對於確定這些表達式的結果至關重要。
問題:
考慮以下兩個 SQL 語句:
<code class="language-sql">SELECT [...] FROM [...] WHERE some_col in (1,2,3,4,5) AND some_other_expr</code>
<code class="language-sql">SELECT [...] FROM [...] WHERE some_col in (1,2,3) or some_col in (4,5) AND some_other_expr</code>
這些語句是否等效?是否有像真值表這樣的工具可以幫助驗證它們的等效性?
答案:
否,這兩個語句不等效。 “AND”的優先順序高於“OR”,這意味著表達式 some_col in (1,2,3,4,5) AND some_other_expr
首先被評估,然後該評估的結果再應用於 OR 運算符。
為了說明這一點,請考慮以下範例:
<code class="language-sql">Declare @x tinyInt = 1 Declare @y tinyInt = 0 Declare @z tinyInt = 0 Select Case When @x=1 OR @y=1 And @z=1 Then 'T' Else 'F' End -- 输出 T Select Case When (@x=1 OR @y=1) And @z=1 Then 'T' Else 'F' End -- 输出 F</code>
第一個語句評估 @x=1 OR @y=1 And @z=1
,結果為“T”,因為表達式 @y=1 And @z=1
傳回“False”。然後,「OR」運算子將此結果與「@x=1」(為「True」)組合,最終輸出「T」。
但是,第二個語句對 (@x=1 OR @y=1) And @z=1
的評估方式不同。 “OR”運算子首先組合“@x=1”和“@y=1”,它們都為“True”,結果為“True”。然後,這個「True」結果與「@z=1」(為「False」)進行評估,最終輸出「F」。
因此,評估順序很重要,可以使用括號來覆蓋優先規則。為了讓這兩個語句等效,可以加上括號,如下所示:
<code class="language-sql">SELECT [...] FROM [...] WHERE (some_col in (1,2,3) or some_col in (4,5)) AND some_other_expr</code>
對於那些尋求有關 SQL 中邏輯運算符優先級的更多參考資料的人,建議參考以下資源:
以上是SQL AND/OR 運算子優先權:這些 SQL 語句是否等效?的詳細內容。更多資訊請關注PHP中文網其他相關文章!