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

可以用来验证吗?

评论

尝试:T T F.(T或T)和F.T或(T和F)。代码的读者应该能够清楚地看到代码作者的意图。并且作者需要确保机器能够按照他的预期进行。括号将所有三个对齐:读取器,写入器和机器。 :)

#1 楼

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运算符优先级
SQLite理解的SQL


评论


最好使用括号,即使不需要括号也是如此。几乎没有程序员(如果有的话)知道所有可用运算符的优先级。

–三角龙
13年11月6日,11:45

@Trismegistos希望不是这样……不应该这样,但是我猜你是对的。

–查尔斯·布雷塔纳(Charles Bretana)
2014年4月23日在18:53

此AND然后OR优先级是SQL标准的一部分吗?

–Jaime Hablutzel
2014-09-15 8:27

@Jaime,是的,而且afaik,它也是所有编程语言标准的一部分。

–查尔斯·布雷塔纳(Charles Bretana)
2014-09-15 12:45

@Bsienn,不确定您做了什么,但这与标准SQL和MySQL文档不一致。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'结束

–查尔斯·布雷塔纳(Charles Bretana)
15年5月18日在18:27

#2 楼

我要加2点:


“ IN”是有效的串行OR,并在其周围加上括号
,并且在我所知道的每种语言中都优先于OR

因此,这两个表达式根本不相等。

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)
2015年12月25日在6:49

这么说让我很痛苦,而且在红宝石中没有OR优先!更糟的是,&&的优先级高于|| !!我不喜欢红宝石的原因之一-它违反了我一遍又一遍的最小惊讶原则。 2.2.1:007> true或true和false => false 2.2.1:008> true ||真&&假=>真

– Alex L
17 Mar 1 '17 at 0:01

#3 楼


算术运算符
串联运算符
比较条件
IS [NOT] NULL,LIKE,[NOT] IN
[NOT]之间
不等于
非逻辑条件
与逻辑条件
OR逻辑条件

可以使用括号来覆盖优先级规则。

#4 楼

查询以显示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