代码之家  ›  专栏  ›  技术社区  ›  Red

为什么SQL Server不遵循Bodmas的求和数学规则?

  •  -2
  • Red  · 技术社区  · 8 年前

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

    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 回复  |  直到 8 年前
        1
  •  7
  •   melpomene    8 年前
    1000 - 300 + 300 = 400
    

    + -

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

        2
  •  0
  •   Gordon Linoff    8 年前

    10 − 3 + 2.