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拆分,并更改优先级

  • 算术运算符
  • 串联运算符
  • 比较条件
  • 是[NOT]NULL,如[NOT]IN
  • [不]介于
  • 不等于
  • 非逻辑条件
  • 逻辑条件
  • 或逻辑条件

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

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