【发布时间】:2019-06-28 00:50:03
【问题描述】:
- 如果你执行
SELECT -100/-100*10,结果是0。 - 如果你执行
SELECT (-100/-100)*10,结果是10。 - 如果你执行
SELECT -100/(-100*10),结果是0。 - 如果你执行
SELECT 100/100*10,结果是10。
BOL 状态:
当表达式中的两个运算符具有相同的运算符优先级时,将根据它们在表达式中的位置从左到右计算它们。
和
Level Operators
1 ~ (Bitwise NOT)
2 * (Multiplication), / (Division), % (Modulus)
3 + (Positive), - (Negative), + (Addition), + (Concatenation), - (Subtraction), & (Bitwise AND), ^ (Bitwise Exclusive OR), | (Bitwise OR)
是 BOL 错了,还是我遗漏了什么?似乎- 正在抛弃(预期的)优先级。
【问题讨论】:
-
你有什么问题?
-
为什么你认为你必须使用位,你正在使用整数。并且整数/整数=整数。所以 -100/-1000 是 0
-
好的,我同意
-似乎确实导致流程“错误”。如果你尝试-100/(-100)*10,你会得到10的结果。似乎/被应用于方程中的值-,然后方程100*10正在被确定。我不确定这是 BOL 的错误,但更多的是 SQL Server 没有按预期运行。可能值得在sql-docs 上提出一个问题,看看他们的反应是什么;也许可以在说明“功能”的文档中添加注释。 -
SELECT -100/(-100)*10也返回 10。看起来-被视为-运算符,仅应在计算100*10后应用 -
A / -B * C是A <div> <negate> B <multiply> C。根据文档,否定的优先级低于乘法,因此结果为A / -(B * C)。你可以通过使用浮动常量更清楚地看到这一点:12e / -13e * 14evs.12e / (-13e) * 14evs12e / 13e * 14e。这让我们失望的原因是因为我们通常期望一元减号成为文字的一部分,或者至少有非常高的优先级,但这不是 T-SQL 的工作方式。
标签: sql sql-server tsql operator-precedence