以下两个陈述是否相同?
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
我可以用某种真值表来验证这个吗?
答案 0 :(得分:244)
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
对于那些喜欢咨询参考文献的人(按字母顺序排列):
答案 1 :(得分:31)
我会加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分开,并改变优先级。
答案 2 :(得分:21)
您可以使用括号覆盖优先规则。
答案 3 :(得分:8)
查询以显示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