От this question, a neat answer about using COALESCE для упрощения сложных деревьев логики. Я рассмотрел проблему короткого замыкания.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
Если оценивали второй случай, когда Знаменатель = 0, я хотел бы ожидать чтобы увидеть ошибку, как:
Msg 8134, Level 16, State 1, Line 1
Divide by zero error encountered.
Я нашел некоторые mentionsrelated в Oracle. И некоторые тесты с SQL Server. Похоже, короткое замыкание может сломаться при включении пользовательских функций.
Итак, должно ли это поведение гарантируется стандартом ANSI?
[Высоко Связанные] (http://stackoverflow.com/q/7473045/73226) –
Резюмируя DBA ответ, 'ВЫБРАТЬ COALESCE (1, (SELECT 1/0))' выполняется без ошибок и показывает, что это короткое замыкание. Интерпретатор рассматривает это как сокращенную инструкцию 'CASE'. –