提问人:AspOnMyNet 提问时间:4/24/2010 最后编辑:AspOnMyNet 更新时间:11/15/2023 访问量:4785
逻辑运算符 AND 的优先级高于 IN
Logical operator AND having higher order of precedence than IN
问:
我读过逻辑运算符 AND 的优先级高于逻辑运算符 IN,但这没有意义,因为如果这是真的,那么在下面的语句中,AND 条件不会在 IN 条件之前得到评估(因此在 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)
给出不同的结果
答:
至少在 Mysql 中,它的优先级较低。查看 http://dev.mysql.com/doc/refman/5.0/en/operator-precedence.html
我假设您使用的是 SQL Server,就像在 SQL Server 中一样,并且
优先级高于 IN
。所以,是的,首先计算 AND,但计算 AND
的规则是检查左边的表达式(在您的示例中,零件),如果为 true,则检查右边的表达式。简而言之,首先对子句进行评估,但对子句进行评估是作为评估的一部分。IN
AND
IN
AND
将这里的优先顺序理解为是指语句的解析方式,而不是语句的执行方式(即使 MS 的文档对此模棱两可),可能更简单。
根据 OP 的评论进行编辑:
我并不完全确定被归类为逻辑运算符不是特定于 SQL Server 的。我从未读过 ISO 标准,但我要指出的是,MySQL 和 Oracle 文档定义为比较运算符,Postgres 定义为子查询表达式,Sybase 本身定义为“列表运算符”。在我看来,Sybase 最接近这里的标记,因为表达式询问 attribute 的值是否是括号之间的项目列表的元素。IN
IN
a IN (...)
a
也就是说,我可以想象 SQL Server 选择归类为逻辑运算符的原因有两个:IN
IN
等没有 SQL Server 比较运算符的类型限制(、、等不能应用于 text、ntext 或 image 类型; 和其他子集运算符可以用于任何类型,但在严格的 ISO SQL 中,=
!=
IN
NULL
)- 等运算的结果是一个布尔值,就像其他“逻辑运算符”一样
IN
同样,在我看来,这不是一个明智的分类,但这是Microsoft选择的。也许其他人对他们为什么会做出这样的决定有更深入的了解?
评论
我认为是比较运算符,而是逻辑运算符。所以这有点像苹果和橘子,因为必须首先评估比较运算符以查看条件是否为真,然后使用逻辑运算符来计算条件。IN
AND
称我为 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)
评论
在逻辑运算符的优先级方面,工作方式永远不会有歧义。IN
IN
需要在其左侧有一个表达式。这不仅与条件不同,而且 (t)sql 是我见过的少数几种不会使用 0/1 自动将表达式隐式转换为条件的语言之一。
如果运行:,您将收到不正确的语法错误。这不像其他一些语言那样,5=5 会返回 1。select case when 5=5 in (1,2,3) then 1 else 0 end
另一方面,逻辑运算符需要条件。条件也没有从 tsql 转换为表达式的隐式方式 - 只有语句这样做。运行:再次产生错误。case
select * from yourtable where column1
因此,如果您看到以下任一情况:(logical operator) (something) IN (....)
- (something) 是一个表达式,它是 something needs,但不是逻辑运算符 needs not。被计算(尽管据说优先级较低!),它返回一个“布尔值”(即条件的结果),并且可以被逻辑运算符使用
IN
IN
- 或-
- (something) 是一个条件,可以由逻辑运算符使用。但是,所有逻辑运算符都返回“boolean”,因此实际上这种情况始终是语法错误。
右边的事情更容易:据我所知,没有运算符使用值列表,甚至没有使用。(1,2,3)
(select col from sometable)
IN
如果左侧的表达式也可以由使用表达式的运算符使用,例如加法,则可以争辩说存在歧义。在这种情况下,是的,优先级很有用,并告诉我们这件事会首先发生。所以,这个:
select case when 5*3 in (1,2,3) then 1 else 0 end
返回 0,因为乘法首先发生。
评论