我\xe2\x80\x99已经读到逻辑运算符AND比逻辑运算符IN具有更高的优先级,但这没有意义\xe2\x80\x99t因为如果这是真的,那么下面的\xe2\x80\x99t不会语句中 AND 条件在 IN 条件之前被求值(因此在 IN 运算符之前能够检查 Released 字段是否等于括号内指定的任何值?
\n\nSELECT Song, Released, Rating\nFROM Songs\nWHERE\nReleased IN (1967, 1977, 1987)\nAND\nSongName = \xe2\x80\x99WTTJ\xe2\x80\x99\nRun Code Online (Sandbox Code Playgroud)\n\n谢谢
\n\n编辑:
\n\nEgrunin和ig0774,我\xe2\x80\x99已经检查过,除非我完全误解了你的帖子,否则似乎
\n\nWHERE x > 0 AND x < 10 OR special_case = 1
确实是一样的
\n\nWHERE (x > 0 AND x < 10) OR special_case = 1
也就是说,我做了以下三个查询
\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\nSELECT *\nFROM Songs\nWHERE AvailableOnCD='N' AND (Released > 2000 OR Released = 1989)\nRun Code Online (Sandbox Code Playgroud)\n\n事实证明,以下两个查询产生相同的结果:
\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\nRun Code Online (Sandbox Code Playgroud)\n\n尽管
\n\nSELECT *\nFROM Songs\nWHERE AvailableOnCD='N' AND (Released > 2000 OR Released = 1989)\nRun Code Online (Sandbox Code Playgroud)\n\n给出了不同的结果
\n我假设您正在使用 SQL Server,因为 SQL Server 的AND优先级高于IN. 所以,是的,首先评估 AND ,但评估 的规则AND是检查左侧的表达式IN(在您的示例中,部分),如果为真,则检查右侧的表达式。简而言之,AND子句首先被评估,但IN子句作为评估的一部分被评估AND。
将这里的优先顺序理解为指的是如何解析语句,而不是如何执行它可能更简单(即使 MS 的文档对此含糊其辞)。
编辑回应OP的评论:
我不能完全确定IN被归类为逻辑运算符并不是特定于SQL Server的。我从未读过 ISO 标准,但我注意到MySQL和Oracle文档定义IN为比较运算符,Postgres定义为子查询表达式,Sybase 本身定义为“列表运算符”。在我看来,Sybase 是最接近此处标记的,因为表达式a IN (...)询问属性的值是否a是括号之间的项目列表的元素。
也就是说,我可以想象 SQL Server 选择分类IN为逻辑运算符的原因有两个:
IN等没有SQL Server 比较运算符的类型限制(=、!=等不能应用于 text、ntext 或 image 类型;IN其他子集运算符可用于任何类型,除了严格的 ISO SQL 中的NULL)IN是一个布尔值,就像其他“逻辑运算符”一样同样,在我看来,这不是一个明智的分类,但这是微软选择的。也许其他人更深入地了解他们为什么会做出这样的决定?