SQL論理演算子の優先順位:AndおよびOr


179

以下の2つのステートメントは同等ですか?

SELECT [...]
FROM [...]
WHERE some_col in (1,2,3,4,5) AND some_other_expr

そして

SELECT [...]
FROM [...]
WHERE some_col in (1,2,3) or some_col in (4,5) AND some_other_expr

これを確認するために使用できるある種の真理値表はありますか?


4
TT F.(TまたはT)およびF. Tまたは(TおよびF)を試してください。コードの読者は、コードの作成者の意図を明確に理解できる必要があります。そして、ライターは、マシンが意図したとおりに動作していることを確認する必要があります。括弧は、リーダー、ライター、マシンの3つすべてを揃えます。:)
アサドエブラヒム2015年

回答:


290

Andがに優先するOrため、たとえa <=> a1 Or a2

Where a And b 

と同じではありません

Where a1 Or a2 And b,

それは次のように実行されるため

Where a1 Or (a2 And b)

そして、それらを同じにするために、次のようにします(括弧を使用して優先規則を上書きします)。

 Where (a1 Or a2) And b

以下に例を示します。

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 -- outputs T
Select Case When (@x=1 OR @y=1) And @z=1 Then 'T' Else 'F' End -- outputs F

参考資料を参考にしたい方(アルファベット順):


18
括弧が不要な場合でも、括弧を使用することをお勧めします。利用可能なすべての演算子の優先順位を知っているプログラマは(存在する場合)非常に少数です。
Trismegistos 2013年

1
@Trismegistosそれがそうでなかったらいいのに...それはそうではないはずですが、私はあなたが正しいと思います。
Charles Bretana、2014

1
このAND後、OR優先順位はSQL標準の一部ですか?
Jaime Hablutzel、2014

@Jaime、はい、そしてafaikは、すべてのプログラミング言語の標準の一部でもあります。
Charles Bretana、2014

4
@Bsienn、何をしたかわかりませんが、標準SQLやMySQLのドキュメントとは一貫していません... dev.mysql.com/doc/refman/5.0/en/operator-precedence.html 再試行してください。時間...試してみる 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 select case when (@x=1 or @y=1) and @z=1 then'T' else 'F' end
Charles Bretana、

33

2点追加します:

  • 「IN」は、括弧で囲まれた実質的なシリアルORです。
  • ANDは、私が知っているすべての言語でORよりも優先されます

したがって、2つの式は単純に等しくありません。

WHERE some_col in (1,2,3,4,5) AND some_other_expr
--to the optimiser is this
WHERE
     (
     some_col = 1 OR
     some_col = 2 OR 
     some_col = 3 OR 
     some_col = 4 OR 
     some_col = 5
     )
     AND
     some_other_expr

したがって、IN句を分割すると、シリアルORが分割され、優先順位が変更されます。


gbn ORACLE SQLには連想性がありますか?はいの場合、どのようにしてどこですべての演算子の関連付けを取得できますか?
Asif Mushtaq

2
それを言うのは苦痛ですが、ルビーではANDはORよりも優先されません!さらに悪いことに、&& ||!よりも優先されます。私がルビーを好きではない理由の1つは、それが私にとって驚きを最小限に抑えるという原則に違反しています。2.2.1:007> trueまたはtrueおよびfalse => false 2.2.1:008> true || true && false => true
Alex L

23
  1. 算術演算子
  2. 連結演算子
  3. 比較条件
  4. IS [NOT] NULL、LIKE、[NOT] IN
  5. [NOT] BETWEEN
  6. 等しくない
  7. 論理条件ではありません
  8. AND論理条件
  9. OR論理条件

括弧を使用して、優先規則を上書きできます。


9

3変数ブール式真理値表を表示するクエリ:

;WITH cteData AS
(SELECT 0 AS A, 0 AS B, 0 AS C
UNION ALL SELECT 0,0,1
UNION ALL SELECT 0,1,0
UNION ALL SELECT 0,1,1
UNION ALL SELECT 1,0,0
UNION ALL SELECT 1,0,1
UNION ALL SELECT 1,1,0
UNION ALL SELECT 1,1,1
)
SELECT cteData.*,
    CASE WHEN

(A=1) OR (B=1) AND (C=1)

    THEN 'True' ELSE 'False' END AS Result
FROM cteData

の結果(A=1) OR (B=1) AND (C=1)

A   B   C   Result
0   0   0   False
0   0   1   False
0   1   0   False
0   1   1   True
1   0   0   True
1   0   1   True
1   1   0   True
1   1   1   True

の結果(A=1) OR ( (B=1) AND (C=1) )は同じです。

の結果( (A=1) OR (B=1) ) AND (C=1)

A   B   C   Result
0   0   0   False
0   0   1   False
0   1   0   False
0   1   1   True
1   0   0   False
1   0   1   True
1   1   0   False
1   1   1   True
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.