昨天我遇到了一个与旧存储过程有关的非常令人困惑的问题,尽管我已对其进行“修复”,但我不明白为什么需要这样做。
BODMAS-数学运算的顺序:
括号,顺序,除法,乘法,加法,减法
因此,加法发生在减法之前。从技术上讲,它们具有同等的权重并“同时”发生,因为它们通常会相互抵消。
在同意之后,我们应该能够同意以下所有内容:
但是,SQL评估中间值为1000。我可以通过添加方括号来轻松地对此进行补救。我担心的是,尽管此示例简洁明了,但当数字300来自合并汇总时,已经有很多括号在飞来飞去。完全可行的是,它们可能会被遵循BODMAS逻辑的人意外删除,或者在代码优化器中被标记为冗余。
这里有一些代码可以自己尝试
CREATE TABLE #TempData ([Number] INT)
INSERT INTO #TempData VALUES(200)
INSERT INTO #TempData VALUES(100)
SELECT 1000 - (SUM(Number) + SUM(Number))
FROM #TempData
SELECT 1000 - SUM(Number) + SUM(Number)
FROM #TempData
SELECT (1000 - SUM(Number)) + SUM(Number)
FROM #TempData
DROP TABLE #TempData
答案 0 :(得分:7)
1000 - 300 + 300 = 400
这是错误的。
正如您所说,+
和-
的权重相等,并且同时发生。按照惯例,基本操作都是左关联的,因此从左到右处理一行中相同权重的多个运算符:
1000 - 300 + 300 = ((1000 - 300) + 300
在任何地方(数学,SQL,大多数编程语言)都是如此,因此问题不是SQL与常规数学符号之间的区别,而是对该约定的误解。
答案 1 :(得分:0)
您对BODMAS的解释完全不正确。乘法/除法和加法/减法实际上没有排序,它们是等效的,并从左侧进行评估。
这一点在Wikipedia中得到了专门解决:
例如,以“添加优先”的顺序使用[BODMAS], 之后减去”将错误地评估表达式[6]
10 − 3 + 2.
正确的值是9(而不是5),就好像要加上 首先将其取出,然后将结果与减法一起使用。