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


177

下面的两个语句是否等效?

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)。代码的读者应该能够清楚地看到代码作者的意图。并且作者需要确保机器能够按照他的预期进行。括号将所有三个对齐:读取器,写入器和机器。:)
阿萨德·易卜拉欣2015年

Answers:


286

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

1
@Trismegistos希望不是那样……不应该这样,但是我猜你是对的。
Charles Bretana 2014年

1
AND那么,此OR优先级是SQL标准的一部分吗?
Jaime Hablutzel 2014年

@Jaime,是的,而且afaik,它也是所有编程语言标准的一部分。
查尔斯·布雷塔纳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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.