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

Logical operator AND having higher order of precedence than IN

提问人:AspOnMyNet 提问时间:4/24/2010 最后编辑:AspOnMyNet 更新时间:11/15/2023 访问量:4785

问:

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

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

谢谢

编辑:

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

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)

给出不同的结果

SQL格式

评论

0赞 shahkalpesh 4/24/2010
那么,你期待什么结果呢?您能用简单的术语描述一下结果吗?即获取 67 年发行的所有歌曲,如果找不到它,则获取名称为“WTTJ”的歌曲。
0赞 egrunin 4/25/2010
他期待所有的歌曲(1967 年、1977 年或 1987 年发行)和(名为“WTTJ”)
0赞 egrunin 4/26/2010
你的例子是正确的:慷慨地对待 parens。
0赞 AspOnMyNet 4/27/2010
给我买一杯啤酒,一切都会被原谅;)谢谢大家对我的帮助

答:

2赞 tloach 4/24/2010 #1

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

5赞 ig0774 4/24/2010 #2

我假设您使用的是 SQL Server,就像在 SQL Server 中一样,并且优先级高于 IN。所以,是的,首先计算 AND,但计算 AND 的规则是检查左边的表达式(在您的示例中,零件),如果为 true,则检查右边的表达式。简而言之,首先对子句进行评估,但对子句进行评估是作为评估的一部分。INANDINAND

将这里的优先顺序理解为是指语句的解析方式,而不是语句的执行方式(即使 MS 的文档对此模棱两可),可能更简单。


根据 OP 的评论进行编辑:

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

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

  1. IN等没有 SQL Server 比较运算符的类型限制(、、等不能应用于 text、ntext 或 image 类型; 和其他子集运算符可以用于任何类型,但在严格的 ISO SQL 中,=!=INNULL)
  2. 等运算的结果是一个布尔值,就像其他“逻辑运算符”一样IN

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

评论

0赞 AspOnMyNet 4/24/2010
是的,我正在使用 sql server,尽管这本书一般是关于 SQL 的。A) 运算符 ALL、ANY、BETWEEN、IN、LIKE、SOME 的优先级也低于 AND。我假设它们也被视为 IN 运算符,因为它们被计算为 AND 运算符左侧或右侧表达式的一部分(并作为 AND 计算的一部分) B) 但是为什么 IN 被认为是逻辑运算符而不是比较运算符呢?
0赞 AspOnMyNet 4/24/2010
“=、!= 等不能应用于文本,ntext”说运算符“=、!= 等”不能应用于文本是什么意思?难道我们不能进行像 Some_column = 'A' 这样的比较吗?
1赞 ig0774 4/25/2010
@AspOnMyNet 'text'、'ntext' 等是过时的 TSQL 数据类型。请参阅此处:msdn.microsoft.com/en-us/library/ms187993.aspx。存储文本数据的大多数列的类型为 VARCHAR(可变长度字符)或 CHAR(固定长度字符)。在旧版本的 SQL Server 中,对 VARCHAR 字段允许超过 TEXT 的长度有硬性限制。
2赞 LesterDove 4/24/2010 #3

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

3赞 egrunin 4/24/2010 #4

称我为 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)

评论

0赞 AspOnMyNet 4/24/2010
嗯,你是在暗示“WHERE x > 0 和 x < 10 或 special_case = 1”与“WHERE x > 0 和 (x < 10 或 special_case = 1)”相同吗?我以为“WHERE x > 0 和 x < 10 或 special_case = 1”和“WHERE (x > 0 和 x < 10) 或 special_case = 1”是一样的?!
0赞 ig0774 4/25/2010
@AspOnMyNet:没有。首先计算 AND,因此 x < 10 OR special_case = 1 被理解为评估的右侧。
0赞 egrunin 4/25/2010
@AspOnMyNet:你刚刚证明了我的观点。多几个parens总比太少好。
1赞 egrunin 4/26/2010
@AspOnMyNet - 修复了我的示例。
0赞 George Menoutis 11/15/2023 #5

在逻辑运算符的优先级方面,工作方式永远不会有歧义。IN

IN需要在其左侧有一个表达式。这不仅与条件不同,而且 (t)sql 是我见过的少数几种不会使用 0/1 自动将表达式隐式转换为条件的语言之一。

如果运行:,您将收到不正确的语法错误。这不像其他一些语言那样,5=5 会返回 1。select case when 5=5 in (1,2,3) then 1 else 0 end

另一方面,逻辑运算符需要条件。条件也没有从 tsql 转换为表达式的隐式方式 - 只有语句这样做。运行:再次产生错误。caseselect * from yourtable where column1

因此,如果您看到以下任一情况:(logical operator) (something) IN (....)

  1. (something) 是一个表达式,它是 something needs,但不是逻辑运算符 needs not。被计算(尽管据说优先级较低!),它返回一个“布尔值”(即条件的结果),并且可以被逻辑运算符使用ININ
  • 或-
  1. (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,因为乘法首先发生。