我刚刚遇到麻烦我在MSSQL中。 如果我这样做:
SELECT 1 | 0 & 0
输出为0
- 我认为&
运算符优先于|
运算符。
有什么想法吗?这是MSSQL中的错误还是预期的行为?
答案 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的运营商优先级文档页面。显然,这种方式已经持续了很长时间(可能一直都是这样)。