Von this question, a neat answer about using COALESCE, um komplexe logische Bäume zu vereinfachen. Ich habe über das Problem des Kurzschlusses nachgedacht.COALESCE - garantiert kurzgeschlossen?
Zum Beispiel werden in Funktionen in den meisten Sprachen Argumente vollständig ausgewertet und dann in die Funktion übernommen. In C:
int f(float x, float y) {
return x;
}
f(a, a/b) ; // This will result in an error if b == 0
Das ist nicht eine Beschränkung der COALESCE
"Funktion" in SQL Server zu sein scheint:
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
Wenn es den zweiten Fall der Bewertung wurde, wenn Denominator = 0, würde ich erwarten, einen Fehler wie zu sehen:
Msg 8134, Level 16, State 1, Line 1
Divide by zero error encountered.
fand ich einige mentionsrelated zu Oracle. Und einige Tests mit SQL Server. Es sieht so aus, als könnte der Kurzschluss zusammenbrechen, wenn Sie benutzerdefinierte Funktionen hinzufügen.
Soll dieses Verhalten also vom ANSI-Standard garantiert werden?
[Highly Verwandte] (http://stackoverflow.com/q/7473045/73226) –
die DBA Antwort Zusammengefasst SELECT COALESCE (1, (SELECT 1/0)) 'läuft ohne Fehler und zeigt, dass es kurzschließt. Der Dolmetscher sieht es als eine verkürzte "CASE" -Anweisung. –