Da this question, a neat answer about using COALESCE per semplificare alberi logici complessi. Ho considerato il problema del cortocircuito.COALESCE: garantito al cortocircuito?
Ad esempio, nelle funzioni nella maggior parte delle lingue, gli argomenti vengono valutati completamente e vengono quindi passati alla funzione. In C:
int f(float x, float y) {
return x;
}
f(a, a/b) ; // This will result in an error if b == 0
Ciò non sembra essere una limitazione della "funzione" COALESCE
in 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
Se fosse valutando secondo caso in cui denominatore = 0, I si aspetterebbe per vedere un errore come:
Msg 8134, Level 16, State 1, Line 1
Divide by zero error encountered.
ho trovato alcuni mentionsrelated a Oracle. E alcuni test con SQL Server. Sembra che il cortocircuito potrebbe interrompersi quando si includono funzioni definite dall'utente.
Quindi, questo comportamento dovrebbe essere garantito dallo standard ANSI?
[altamente correlati] (http://stackoverflow.com/q/7473045/73226) –
Per riassumere la risposta DBA, 'SELEZIONARE COALESCE (1, (SELECT 1/0))' viene eseguita senza errori e mostra che cortocircuiti. L'interprete lo vede come un'istruzione 'CASE' abbreviata. –