为什么SQL Server不使用SUM遵循BODMAS数学规则?

时间:2018-07-06 08:25:12

标签: sql sql-server math

昨天我遇到了一个与旧存储过程有关的非常令人困惑的问题,尽管我已对其进行“修复”,但我不明白为什么需要这样做。

  

BODMAS-数学运算的顺序:

     

括号,顺序,除法,乘法,加法,减法

因此,加法发生在减法之前。从技术上讲,它们具有同等的权重并“同时”发生,因为它们通常会相互抵消。

在同意之后,我们应该能够同意以下所有内容:

  • 1000-(300 + 300)= 400
  • 1000-300 + 300 = 400
  • (1000-300)+ 300 = 1000

但是,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

2 个答案:

答案 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),就好像要加上   首先将其取出,然后将结果与减法一起使用。