SQL逻辑运算符优先级:和和或

这两个陈述是否相同?

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

是否有某种真理表可以用来验证?


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

对于喜欢查阅参考资料的人(按字母顺序):

  • Microsoft Transact-SQL运算符优先级
  • Oracle MySQL 9运算符优先级
  • Oracle 10g条件优先
  • PostgreSQL运算符优先级
  • SQL被SQLite理解

  • 我会加2分:

  • “IN”与他们周围的括号实际上是连续的OR
  • 并且在我知道的每种语言中优先于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分开,并改变优先级。


  • 算术运算符
  • 连接操作符
  • 比较条件
  • IS [NOT] NULL,LIKE,[NOT] IN
  • [NOT] BETWEEN
  • 不等于
  • 不符合逻辑条件
  • AND逻辑条件
  • OR逻辑条件
  • 您可以使用括号来覆盖优先规则。

    链接地址: http://www.djcxy.com/p/58891.html

    上一篇: SQL Logic Operator Precedence: And and Or

    下一篇: PHP's =& operator