COALESCE
est une fonction plus moderne qui fait partie de ANSI-92
norme.
NVL
est Oracle
spécifique, il a été introduit en 80
's avant qu'il n'y ait de normes.
En cas de deux valeurs, elles sont synonymes.
Cependant, ils sont implémentés différemment.
NVL
évalue toujours les deux arguments, tandis que COALESCE
arrête généralement l'évaluation chaque fois qu'il trouve le premier non-NULL
(il y a quelques exceptions, comme la séquence NEXTVAL
):
SELECT SUM(val)
FROM (
SELECT NVL(1, LENGTH(RAWTOHEX(SYS_GUID()))) AS val
FROM dual
CONNECT BY
level <= 10000
)
Cela dure presque 0.5
secondes, puisqu'il génère SYS_GUID()
's, malgré 1
n'étant pas un NULL
.
SELECT SUM(val)
FROM (
SELECT COALESCE(1, LENGTH(RAWTOHEX(SYS_GUID()))) AS val
FROM dual
CONNECT BY
level <= 10000
)
Ceci comprend que 1
n'est pas un NULL
et n'évalue pas le second argument.
SYS_GUID
ne sont pas générés et la requête est instantanée.