Из этот вопрос, аккуратный ответ об использовании COALESCE, чтобы упростить сложные деревья логики. Я рассмотрел проблему короткого замыкания.
Например, в функциях большинства языков аргументы полностью оцениваются и затем передаются в функцию. В C:
int f(float x, float y) {
return x;
}
f(a, a / b) ; // This will result in an error if b == 0
Это не является ограничением функции COALESCE
"в SQL Server:
CREATE TABLE Fractions (
Numerator float
,Denominator float
)
INSERT INTO Fractions VALUES (1, 1)
INSERT INTO Fractions VALUES (1, 2)
INSERT INTO Fractions VALUES (1, 3)
INSERT INTO Fractions VALUES (1, 0)
INSERT INTO Fractions VALUES (2, 0)
INSERT INTO Fractions VALUES (3, 0)
SELECT Numerator
,Denominator
,COALESCE(
CASE WHEN Denominator = 0 THEN 0 ELSE NULL END,
CASE WHEN Numerator <> 0 THEN Numerator / Denominator ELSE NULL END,
0
) AS TestCalc
FROM Fractions
DROP TABLE Fractions
Если бы он оценивал второй случай, когда Denominator = 0, я ожидал бы увидеть ошибку, например:
Msg 8134, Level 16, State 1, Line 1
Divide by zero error encountered.
Я нашел упоминает связанный с Oracle, И некоторые тесты с SQL Server. Похоже, короткое замыкание может сломаться при включении пользовательских функций.
Итак, должно ли это поведение гарантироваться стандартом ANSI?