为什么SQL Server不遵循带有SUM的BODMAS数学规则?

Red*_*Red -2 sql sql-server math

我昨天遇到了遗留存储过程的一个非常令人困惑的问题,虽然我已经"修复"它,但我不觉得我理解为什么需要它.

BODMAS - 数学运算的顺序:

括号,顺序,分区,乘法,加法,减法

所以,加法发生在减法之前.从技术上讲,它们具有相同的权重并且"同时"发生,因为它们通常相互抵消.

经过同意,我们应该同意以下内容都是正确的:

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

但是,SQL将中间值评估为1000.我可以通过添加括号来轻松解决此问题.我担心的是,尽管这个例子简洁明了,当数字300来自Coalesced Sums时,已经有很多括号飞来飞去.完全可行的是,他们可能被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
Run Code Online (Sandbox Code Playgroud)

mel*_*ene 7

1000 - 300 + 300 = 400
Run Code Online (Sandbox Code Playgroud)

这是错的.

正如你所说的那样,+并且-同样地加权并且同时发生.按照惯例,基本操作都是左关联的,因此从左到右处理一行中相同权重的多个操作符:

1000 - 300 + 300 = ((1000 - 300) + 300
Run Code Online (Sandbox Code Playgroud)

这在任何地方都是如此(数学,SQL,大多数编程语言),所以问题不是SQL和传统数学符号之间的区别,而是对约定的误解.