逻辑运算符 AND 的优先级高于 IN

Asp*_*Net 1 sql

我\xe2\x80\x99已经读到逻辑运算符AND比逻辑运算符IN具有更高的优先级,但这没有意义\xe2\x80\x99t因为如果这是真的,那么下面的\xe2\x80\x99t不会语句中 AND 条件在 IN 条件之前被求值(因此在 IN 运算符之前能够检查 Released 字段是否等于括号内指定的任何值?

\n\n
SELECT Song, Released, Rating\nFROM Songs\nWHERE\nReleased IN (1967, 1977, 1987)\nAND\nSongName = \xe2\x80\x99WTTJ\xe2\x80\x99\n
Run Code Online (Sandbox Code Playgroud)\n\n

谢谢

\n\n

编辑:

\n\n

Egruninig0774,我\xe2\x80\x99已经检查过,除非我完全误解了你的帖子,否则似乎

\n\n

WHERE x > 0 AND x < 10 OR special_case = 1

\n\n

确实是一样的

\n\n

WHERE (x > 0 AND x < 10) OR special_case = 1

\n\n

也就是说,我做了以下三个查询

\n\n
SELECT * \nFROM Songs \nWHERE AvailableOnCD='N' AND Released > 2000 OR Released = 1989\n\nSELECT *\nFROM Songs\nWHERE (AvailableOnCD='N' AND Released > 2000) OR Released = 1989\n\nSELECT *\nFROM Songs\nWHERE AvailableOnCD='N' AND (Released > 2000 OR Released = 1989)\n
Run Code Online (Sandbox Code Playgroud)\n\n

事实证明,以下两个查询产生相同的结果:

\n\n
SELECT * \nFROM Songs \nWHERE AvailableOnCD='N' AND Released > 2000 OR Released = 1989\n\nSELECT *\nFROM Songs\nWHERE (AvailableOnCD='N' AND Released > 2000) OR Released = 1989\n
Run Code Online (Sandbox Code Playgroud)\n\n

尽管

\n\n
SELECT *\nFROM Songs\nWHERE AvailableOnCD='N' AND (Released > 2000 OR Released = 1989)\n
Run Code Online (Sandbox Code Playgroud)\n\n

给出了不同的结果

\n

ig0*_*774 5

我假设您正在使用 SQL Server,因为 SQL Server 的AND优先级高于IN. 所以,是的,首先评估 AND ,但评估 的规则AND是检查左侧的表达式IN(在您的示例中,部分),如果为真,则检查右侧的表达式。简而言之,AND子句首先被评估,但IN子句作为评估的一部分被评估AND

将这里的优先顺序理解为指的是如何解析语句,而不是如何执行它可能更简单(即使 MS 的文档对此含糊其辞)。


编辑回应OP的评论:

我不能完全确定IN被归类为逻辑运算符并不是特定SQL Server的。我从未读过 ISO 标准,但我注意到MySQLOracle文档定义IN为比较运算符,Postgres定义为子查询表达式,Sybase 本身定义为“列表运算符”。在我看来,Sybase 是最接近此处标记的,因为表达式a IN (...)询问属性的值是否a是括号之间的项目列表的元素。

也就是说,我可以想象 SQL Server 选择分类IN为逻辑运算符的原因有两个:

  1. IN等没有S​​QL Server 比较运算符的类型限制=!=等不能应用于 text、ntext 或 image 类型;IN其他子集运算符可用于任何类型,除了严格的 ISO SQL 中的NULL
  2. 等操作的结果IN是一个布尔值,就像其他“逻辑运算符”一样

同样,在我看来,这不是一个明智的分类,但这是微软选择的。也许其他人更深入地了解他们为什么会做出这样的决定?