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

问题描述 投票:-2回答:2

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

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
sql sql-server math
2个回答
7
投票
1000 - 300 + 300 = 400

这是错的。

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

1000 - 300 + 300 = ((1000 - 300) + 300

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


0
投票

您对BODMAS的解释完全不正确。乘法/除法和加法/减法实际上没有排序,它们是等价的并且从左边开始计算。

维基百科专门讨论了这一点:

例如,按照“先添加,后减法”的顺序使用[BODMAS]会错误地评估表达式[6]

10 − 3 + 2.

正确的值是9(而不是5,好像首先执行加法,然后结果与减法一起使用)。

© www.soinside.com 2019 - 2024. All rights reserved.