Вчера я столкнулся с очень запутанной проблемой с унаследованной хранимой процедурой, и хотя я "исправил" ее, я не чувствую, что понимаю, зачем она нужна.
БОДМАС - Порядок математических операций:
Скобки, порядок, деление, умножение, сложение, вычитание
Итак, сложение происходит до вычитания. Технически они одинаково взвешены и происходят «одновременно», потому что они, как правило, противостоят друг другу.
С этим соглашением мы должны быть в состоянии согласиться с тем, что все следующее верно:
- 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