我刚刚在 MSSQL 中遇到了让我困惑的问题。如果我这样做:
SELECT 1 | 0 & 0
输出是0
- 我会认为&
运算符优先于|
运算符。
有任何想法吗 ?这是 MSSQL 中的错误还是预期行为?
我刚刚在 MSSQL 中遇到了让我困惑的问题。如果我这样做:
SELECT 1 | 0 & 0
输出是0
- 我会认为&
运算符优先于|
运算符。
有任何想法吗 ?这是 MSSQL 中的错误还是预期行为?
根据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 级和OR
7 级。这意味着AND
将首先和OR
之后评估。
括号当然是任何非平凡表达式的首选。在您的情况下,它似乎微不足道,是的,因此没有使用括号,但是由于按位运算符在同一级别上运行,因此必须在组合至少 3 个操作数时使用它们,或者确保以您希望它们评估的方式对运算符进行排序. 在你的情况下:
select 0 & 0 | 1
会产生正确的结果。
自 SQL Server 2008 以来,按位运算符的优先级已经均衡。SQL Server 2005及更早版本在较低级别 (5) 上具有按位|
(以及排他性 or ^
),因此您的表达式将正确计算。为什么微软决定将所有位运算符放在同一级别上对我来说是个谜。
事实证明,SQL Books Online 声明了无效的现实生活处理(感谢@MartinSmith)。所以他们刚刚更新了 SQL Server 2008 的运算符优先级文档页面。显然,这种方式已经工作了很长时间(也许一直如此)。