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

时间:2010-04-23 17:56:43

标签: sql

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

SELECT Song, Released, Rating
FROM Songs
WHERE
Released IN (1967, 1977, 1987)
AND
SongName = ’WTTJ’

感谢名单

修改

Egrunin ig0774 ,我已经检查过,除非我完全误解了你的帖子,似乎

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

确实与

相同

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

即,我做了以下三个查询

SELECT * 
FROM Songs 
WHERE AvailableOnCD='N' AND Released > 2000 OR Released = 1989

SELECT *
FROM Songs
WHERE (AvailableOnCD='N' AND Released > 2000) OR Released = 1989

SELECT *
FROM Songs
WHERE AvailableOnCD='N' AND (Released > 2000 OR Released = 1989)

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

SELECT * 
FROM Songs 
WHERE AvailableOnCD='N' AND Released > 2000 OR Released = 1989

SELECT *
FROM Songs
WHERE (AvailableOnCD='N' AND Released > 2000) OR Released = 1989

SELECT *
FROM Songs
WHERE AvailableOnCD='N' AND (Released > 2000 OR Released = 1989)

给出了不同的结果

4 个答案:

答案 0 :(得分:4)

我将假设您正在使用SQL Server,就像在SQL Server AND has a higher order of precedence than IN中一样。所以,是的,首先评估AND,但the rule for evaluating AND是检查左侧的expression(在您的样本中,IN部分),如果是,则为表达在右边。简而言之,首先评估AND子句,但IN子句作为AND评估的一部分进行评估。

在这里理解优先顺序可能更简单,因为它指的是如何解析语句,而不是如何执行它(即使MS的文档对此有所不同)。


编辑以回应OP的评论:

我并非所有人都确定IN被归类为逻辑运算符特定于SQL Server。我从未阅读过ISO标准,但我注意到MySQLOracle文档将IN定义为比较运算符,将Postgres定义为子查询表达式,{ {3}}作为“列表运算符”。在我看来,Sybase是最接近标记的,因为表达式a IN (...)询问属性a的值是否是括号之间的项列表的元素。

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

  1. IN之类没有Sybase itself=!=等不能应用于text,ntext或图像类型; IN和除了严格的ISO SQL NULL
  2. 之外,其他子集运算符可用于任何类型
  3. IN等操作的结果是一个布尔值,就像其他“逻辑运算符”一样
  4. 同样,在我看来,这不是一个合理的分类,但它是微软选择的。也许其他人进一步了解他们为何如此决定?

答案 1 :(得分:3)

叫我n00b,但我总是在非平凡的复合条件下使用括号。

SELECT Song, Released, Rating
FROM Songs
WHERE
    (Released IN (1967, 1977, 1987))
AND
    SongName = ’WTTJ’

已修改 (更正后,重点仍然相同。)

就在昨天,我被这个抓住了。开始使用代码:

WHERE x < 0 or x > 10

急速改变:

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

打破了,因为这就是我想要的:

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

但这就是我得到的:

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

答案 2 :(得分:2)

至少在Mysql中,它的优先级较低。见http://dev.mysql.com/doc/refman/5.0/en/operator-precedence.html

答案 3 :(得分:2)

我认为IN是比较运算符,而AND是逻辑运算符。所以它有点苹果和橘子,因为必须首先评估比较运算符以查看条件是否为真,然后使用逻辑运算符来评估条件。