我已经读过逻辑运算符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)
给出了不同的结果
答案 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标准,但我注意到MySQL和Oracle文档将IN
定义为比较运算符,将Postgres定义为子查询表达式,{ {3}}作为“列表运算符”。在我看来,Sybase是最接近标记的,因为表达式a IN (...)
询问属性a
的值是否是括号之间的项列表的元素。
那就是说,我可以想象SQL Server选择将IN
归类为逻辑运算符的原因有两个:
IN
之类没有Sybase itself(=
,!=
等不能应用于text,ntext或图像类型; IN
和除了严格的ISO SQL NULL
)IN
等操作的结果是一个布尔值,就像其他“逻辑运算符”一样同样,在我看来,这不是一个合理的分类,但它是微软选择的。也许其他人进一步了解他们为何如此决定?
答案 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
是逻辑运算符。所以它有点苹果和橘子,因为必须首先评估比较运算符以查看条件是否为真,然后使用逻辑运算符来评估条件。