De this question, a neat answer about using COALESCE para simplificar los árboles de lógica complejos. Consideré el problema del cortocircuito.COALESCE: ¿está garantizado un cortocircuito?
Por ejemplo, en funciones en la mayoría de los idiomas, los argumentos se evalúan completamente y luego se pasan a la función. En C:
int f(float x, float y) {
return x;
}
f(a, a/b) ; // This will result in an error if b == 0
que no parece ser una limitación de la "función" COALESCE
en 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
Si se evalúa el segundo caso, cuando Denominador = 0, yo esperaría para ver un error como:
Msg 8134, Level 16, State 1, Line 1
Divide by zero error encountered.
he encontrado algunos mentionsrelated a Oracle. Y algunas pruebas con SQL Server. Parece que el cortocircuito podría romperse cuando incluye funciones definidas por el usuario.
Entonces, ¿se supone que este comportamiento está garantizado por el estándar ANSI?
[altamente relacionada] (http://stackoverflow.com/q/7473045/73226) –
Para resumir la respuesta DBA, SELECT COALESCE (1, (SELECT 1/0)) 'se ejecuta sin errores y muestra que es cortocircuito. El intérprete lo ve como una declaración abreviada de 'CASE'. –