按位运算符优先级

时间:2012-07-16 09:50:37

标签: sql-server

我刚刚遇到麻烦我在MSSQL中。 如果我这样做:

SELECT 1 | 0 & 0

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

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

1 个答案:

答案 0 :(得分:4)

根据SQL Server operator precedence table (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而OR具有7,所以它们将以正确的顺序进行评估。这意味着AND将是先评估,然后评估OR

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

select 0 & 0 | 1

会产生正确的结果。

并非总是如此

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

原来SQL Books Online were stating invalid real life processing(感谢@MartinSmith)。因此,他们刚刚更新了SQL Server 2008的运营商优先级文档页面。显然,这种方式已经持续了很长时间(可能一直都是这样)。