【问题标题】:Are inner parenthesis needed in the WHERE clause? or anywhereWHERE 子句中是否需要内括号?或任何地方
【发布时间】:2021-02-12 15:25:40
【问题描述】:

在 WHERE 部分或任何真正有多个条件(如 OR)的地方,我知道外括号是必需的,但内括号是必需的吗?

例如我的假设是

WHERE A.Title='EMP'
AND ( (A.NAME='Mike') OR (A.ID='9001') )

和写一样

WHERE A.Title='EMP'
AND ( A.NAME='Mike' OR A.ID='9001' )

但是,如果我们删除外括号,那么我知道查询会有所不同。

例子:

WHERE A.Title='EMP'
AND (A.NAME='Mike') OR (A.ID='9001')

WHERE A.Title='EMP'
AND A.NAME='Mike' OR A.ID='9001'

两者都是一样的东西,但根本不是我们想要的。

是否有可能在前 2 个条件之间对数据进行不同的评估?

【问题讨论】:

  • “是否有可能在 2 个条件之间对数据进行不同的评估?” 不会。将单个布尔表达式包裹在括号内不会改变任何事情。
  • @Larnu 谢谢。有人告诉我其他事情,我必须确定。
  • WHERE A.NAME='Mike' OR A.ID='9001',SQL 不是 Lisp。
  • @Mike-SMT I was told something else 究竟是什么?这可能与您的想法无关。 AND 在二进制逻辑中的优先级高于OR,因此在几乎所有语言中A OR B AND C(A OR B) AND C 不同。它与数学中的加法和乘法没有什么不同。甚至使用相同的符号,例如 + 表示 OR
  • 请,推荐查看此顶部关于SQL Logic Operator Precedence: And and Or

标签: sql sql-server parentheses


【解决方案1】:

这就像在数学中

2 + 3 * 4   ==> 14

一样
2 + (3 * 4)   ==> 14

因为乘法的优先级高于加法。如果你想在乘法之前做加法,你必须加括号。

(2 + 3) * 4   ==> 20

在 SQL 中,AND 的优先级高于 OR= 作为比较运算符的优先级高于两者。因此不需要内括号,因为= 将始终首先执行。例如

A.Title='EMP' AND A.NAME='Mike' OR A.ID='9001'

一样
((A.Title='EMP') AND (A.NAME='Mike')) OR (A.ID='9001')

仅当您想在 AND 之前执行 OR 时才需要括号(即使它出现在表达式的第一个位置):

A.Title='EMP' AND (A.NAME='Mike' OR A.ID='9001')

只有当运算符具有相同的优先级时,它们才从左到右进行计算。

有关完整的优先级列表,请参阅:Operator Precedence (Transact-SQL)

【讨论】:

  • 正确我知道。该人说需要先评估 OR 内部的paren。像这样AND ( (A.NAME='Mike') OR (A.ID='9001') ),我不同意,但粗鲁不得不质疑我是否错了,所以我在 SO 上发帖:D
  • 虽然不需要,但清晰性很重要,因此您可以将它们放在更复杂的子句中以提高可读性(尤其是在 AND 和 OR 混合的情况下,您可能会在没有任何括号的情况下得到您想要的,但您应该试图让未来的读者清楚)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-01
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-07
相关资源
最近更新 更多