COALESCE
je modernější funkce, která je součástí ANSI-92
standardní.
NVL
je Oracle
specifický, byl představen v 80
's dříve, než existovaly nějaké standardy.
V případě dvou hodnot se jedná o synonyma.
Jsou však implementovány odlišně.
NVL
vždy vyhodnotí oba argumenty, zatímco COALESCE
obvykle zastaví vyhodnocování vždy, když najde první neNULL
(Existují některé výjimky, například sekvence NEXTVAL
):
SELECT SUM(val)
FROM (
SELECT NVL(1, LENGTH(RAWTOHEX(SYS_GUID()))) AS val
FROM dual
CONNECT BY
level <= 10000
)
Toto běží za téměř 0.5
sekund, protože generuje SYS_GUID()
's, navzdory 1
není NULL
.
SELECT SUM(val)
FROM (
SELECT COALESCE(1, LENGTH(RAWTOHEX(SYS_GUID()))) AS val
FROM dual
CONNECT BY
level <= 10000
)
To znamená, že 1
není NULL
a nevyhodnocuje druhý argument.
SYS_GUID
's nejsou generovány a dotaz je okamžitý.