COALESCE
é uma função mais moderna que faz parte do ANSI-92
padrão. NVL
é Oracle
específico, foi introduzido em 80
antes de haver quaisquer padrões. No caso de dois valores, eles são sinônimos.
No entanto, eles são implementados de forma diferente.
NVL
sempre avalia ambos os argumentos, enquanto COALESCE
geralmente interrompe a avaliação sempre que encontra o primeiro não-NULL
(há algumas exceções, como a sequência NEXTVAL
):SELECT SUM(val)
FROM (
SELECT NVL(1, LENGTH(RAWTOHEX(SYS_GUID()))) AS val
FROM dual
CONNECT BY
level <= 10000
)
Isso é executado por quase
0.5
segundos, pois gera SYS_GUID()
's, apesar de 1
não sendo um NULL
. SELECT SUM(val)
FROM (
SELECT COALESCE(1, LENGTH(RAWTOHEX(SYS_GUID()))) AS val
FROM dual
CONNECT BY
level <= 10000
)
Isso entende que
1
não é um NULL
e não avalia o segundo argumento. SYS_GUID
's não são gerados e a consulta é instantânea.