2

我刚刚在 MSSQL 中遇到了让我困惑的问题。如果我这样做:

SELECT 1 | 0 & 0

输出是0- 我会认为&运算符优先于|运算符。

有任何想法吗 ?这是 MSSQL 中的错误还是预期行为?

4

1 回答 1

4

根据SQL Server 运算符优先级表 (SQL2k8+),@MartinSmith 已经在评论中引用了它,这是优先级的样子:

Level Operators

1     ~ (Bitwise NOT)
2     * (Multiply), / (Division), % (Modulo)
3     + (Positive), - (Negative), + (Add), (+ Concatenate), - (Subtract), & (Bitwise AND), ^ (Bitwise Exclusive OR), | (Bitwise OR)
4     =, >, <, >=, <=, <>, !=, !>, !< (Comparison operators)
5     NOT
6     AND
7     ALL, ANY, BETWEEN, IN, LIKE, OR, SOME
8     = (Assignment)

当表达式中的两个运算符具有相同的运算符优先级时,将根据它们在表达式中的位置从左到右计算它们。

您对按位运算符的问题

如您所见,按位运算符都在同一级别 (3),这就是为什么从左到右评估它们的原因,因此在您的示例|中先评估然后再评估&

布尔逻辑运算符不同

这些当然是按位运算符,而不是逻辑运算符,它们当然会以正确的顺序进行评估,因为AND有 6 级和OR7 级。这意味着AND将首先和OR之后评估。

括号当然是任何非平凡表达式的首选。在您的情况下,它似乎微不足道,是的,因此没有使用括号,但是由于按位运算符在同一级别上运行,因此必须在组合至少 3 个操作数时使用它们,或者确保以您希望它们评估的方式对运算符进行排序. 在你的情况下:

select 0 & 0 | 1

会产生正确的结果。

并不总是这样

自 SQL Server 2008 以来,按位运算符的优先级已经均衡。SQL Server 2005及更早版本在较低级别 (5) 上具有按位|(以及排他性 or ^),因此您的表达式将正确计算。为什么微软决定将所有位运算符放在同一级别上对我来说是个谜。

事实证明,SQL Books Online 声明了无效的现实生活处理(感谢@MartinSmith)。所以他们刚刚更新了 SQL Server 2008 的运算符优先级文档页面。显然,这种方式已经工作了很长时间(也许一直如此)。

于 2012-07-16T09:57:43.210 回答