SQL逻辑运算符优先级:And和Or

nc.*_*nc. 164 sql operator-precedence logical-operators

以下两个陈述是否相同?

SELECT [...]
FROM [...]
WHERE some_col in (1,2,3,4,5) AND some_other_expr
Run Code Online (Sandbox Code Playgroud)

SELECT [...]
FROM [...]
WHERE some_col in (1,2,3) or some_col in (4,5) AND some_other_expr
Run Code Online (Sandbox Code Playgroud)

我可以使用某种真值表来验证这一点吗?

Cha*_*ana 268

And优先于Or,即使如此a <=> a1 Or a2

Where a And b 
Run Code Online (Sandbox Code Playgroud)

是不一样的

Where a1 Or a2 And b,
Run Code Online (Sandbox Code Playgroud)

因为那将被执行为

Where a1 Or (a2 And b)
Run Code Online (Sandbox Code Playgroud)

你想要什么,使它们变得一样,是

 Where (a1 Or a2) And b
Run Code Online (Sandbox Code Playgroud)

这是一个例子来说明:

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
Run Code Online (Sandbox Code Playgroud)

对于那些喜欢咨询参考文献的人(按字母顺序排列):

  • 即使不需要括号,也可以使用括号.很少的程序员(如果有的话)知道所有可用运算符的优先级. (17认同)
  • @Bsienn,不确定你做了什么,但这与标准SQL和MySQL文档不一致... https://dev.mysql.com/doc/refman/5.0/en/operator-precedence.html你应该再试一次, - 这次小心......尝试`声明@x tinyInt = 1``声明@y tinyInt = 0``宣布@z tinyInt = 0``选择情况@ x = 1或@ y = 1和@ z = 1然后'T'否则'F'结束``选择情况时(@ x = 1或@ y = 1)和@ z = 1然后'T'否则'F'结束 (4认同)
  • 哎呀...谢谢...很高兴我问了这个问题:)这里有一些进一步的参考说明了完全相同的东西:http://www.praetoriate.com/t_garmany_easysql_sql_logical_operators.htm时间使用一些括号. (3认同)

gbn*_*gbn 32

我会加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
Run Code Online (Sandbox Code Playgroud)

因此,当您打破IN子句时,将串行OR分开,并更改优先级.

  • 就像我说的那样痛苦,并且在红宝石中没有优先于OR!更糟糕的是,&&**优先于||!我不喜欢红宝石的原因之一 - 它违反了我一次又一次惊讶的原则.2.2.1:007> true或true和false => false 2.2.1:008> true || true && false => true (2认同)

小智 22

  1. 算术运算符
  2. 连接运算符
  3. 比较条件
  4. IS [NOT] NULL,LIKE,[NOT] IN
  5. [NOT] BETWEEN
  6. 不等于
  7. 不是逻辑条件
  8. 和逻辑条件
  9. 或逻辑条件

您可以使用括号覆盖优先级规则.


AjV*_*Jsy 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
Run Code Online (Sandbox Code Playgroud)

结果(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
Run Code Online (Sandbox Code Playgroud)

结果(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
Run Code Online (Sandbox Code Playgroud)