SQL逻辑运算符优先级:And和Or
下面的两个陈述是否相等SQL逻辑运算符优先级:And和Or,sql,logical-operators,operator-precedence,Sql,Logical Operators,Operator Precedence,下面的两个陈述是否相等 SELECT [...] FROM [...] WHERE some_col in (1,2,3,4,5) AND some_other_expr 及 是否有某种真值表可以用来验证这一点?和优先于或,因此,即使a1或a2 Where a And b 不一样 Where a1 Or a2 And b, 因为那会被当作 Where a1 Or (a2 And b) 为了使它们保持一致,您需要以下内容(使用括号覆盖优先规则): 下面是一个例子来说明: Declare
SELECT [...]
FROM [...]
WHERE some_col in (1,2,3,4,5) AND some_other_expr
及
是否有某种真值表可以用来验证这一点?
和
优先于或
,因此,即使a1或a2
Where a 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
对于那些喜欢查阅参考资料的人(按字母顺序):
- “IN”实际上是带括号的串行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拆分,并更改优先级
可以使用括号覆盖优先规则。查询以显示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)或(B=1)和(C=1)
的结果:
(A=1)或((B=1)和(C=1))的结果相同
((A=1)或(B=1))和(C=1)
的结果:
即使不需要括号,也最好使用括号。很少有编程人员(如果有的话)知道所有可用运算符的优先级。@Trismegistos希望不是这样。。。不应该是这样,但我猜你是对的。这个和然后或优先级是SQL标准的一部分吗?@Jaime,是的,而且,好吧,它也是所有编程语言标准的一部分。@Bsienn,不确定你做了什么,但这与标准SQL和MySQL文档不一致。。。您应该再试一次,-这次要小心…尝试声明@x tinyInt=1
声明@y tinyInt=0
声明@z tinyInt=0
在@x=1或@y=1和@z=1和@z=1时选择大小写,然后在@x=1或@y=1时选择大小写,@z=1然后在@T'else'F'端
尝试:T'F.(T或T)和F.T或(T和F)。代码的读取器应该能够清楚地看到代码编写者的意图。编写者需要确保机器正在按其意图运行。括号将三者对齐:读取器、编写器和机器。:)gbn ORACLE SQL中是否存在关联性?如果是的话,那么我如何以及在哪里可以得到所有运算符的结合性呢?尽管我很难说,但它并没有优先于ruby或ruby!更糟糕的是,&&确实比| |更重要!我不喜欢ruby的原因之一是,它一次又一次地违反了我最不惊讶的原则。2.2.1:007>真或真与假=>假2.2.1:008>真| |真与假=>真
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
;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 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 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