Od this question, a neat answer about using COALESCE w celu uproszczenia złożonych drzew logicznych. Rozważyłem problem zwarcia.WĘGIEL - gwarantowane zwarcie?
Na przykład w funkcjach w większości języków argumenty są w pełni analizowane, a następnie przekazywane do funkcji. C:
int f(float x, float y) {
return x;
}
f(a, a/b) ; // This will result in an error if b == 0
To nie wydaje się być ograniczenie „funkcja” COALESCE
w 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
Gdyby były oceny drugi przypadek, gdy mianownik = 0, spodziewałbym zobaczyć błąd jak:
Msg 8134, Level 16, State 1, Line 1
Divide by zero error encountered.
znalazłem niektóre mentionsrelated Oracle. I niektóre testy z SQL Server. Wygląda na to, że zwarcie może się zepsuć, jeśli uwzględnisz funkcje zdefiniowane przez użytkownika.
Czy to zachowanie powinno być zagwarantowane przez normę ANSI?
[spokrewnionych] (http://stackoverflow.com/q/7473045/73226) –
Podsumowując odpowiedź DBA, 'SELECT COALESCE (1, (SELECT 1/0))' działa bez błędu i pokazuje, że to zwarcie. Interpreter traktuje to jako skróconą instrukcję "CASE". –