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 
有什么我可以用来validation这个真理表吗?
  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 
我会加2分:
- “IN”与他们周围的括号是有效的连续OR
 - 并且在我知道的每种语言中优先于OR
 
所以,这两个expression式根本不相等。
 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逻辑条件
 
您可以使用括号来覆盖优先级的规则。
查询显示一个3variables布尔expression式真值表:
 ;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) : 
 ABC 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) : 
 ABC 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 
它们是相同的。 您没有指定数据库types,所以这里是SQL Server 2005中的示例。
 with temp as ( select 'a' as type, 1 as some_col union select 'b' as type, 2 as some_col union select 'c' as type, 3 as some_col union select 'd' as type, 4 as some_col union select 'e' as type, 5 as some_col union select 'f' as type, 6 as some_col ) select * from temp where some_col in (1,2) or some_col in (3) select * from temp where some_col in (1,2,3)