COALESCE
er mere moderne funktion, der er en del af ANSI-92
standard.
NVL
er Oracle
specifik, den blev introduceret i 80
før der var nogen standarder.
I tilfælde af to værdier er de synonymer.
De implementeres dog anderledes.
NVL
evaluerer altid begge argumenter, mens COALESCE
stopper normalt evalueringen, når den finder den første ikke-NULL
(der er nogle undtagelser, såsom sekvens NEXTVAL
):
SELECT SUM(val)
FROM (
SELECT NVL(1, LENGTH(RAWTOHEX(SYS_GUID()))) AS val
FROM dual
CONNECT BY
level <= 10000
)
Dette kører i næsten 0.5
sekunder, da den genererer SYS_GUID()
's, på trods af 1
er ikke en NULL
.
SELECT SUM(val)
FROM (
SELECT COALESCE(1, LENGTH(RAWTOHEX(SYS_GUID()))) AS val
FROM dual
CONNECT BY
level <= 10000
)
Dette forstår, at 1
er ikke en NULL
og evaluerer ikke det andet argument.
SYS_GUID
's genereres ikke, og forespørgslen er øjeblikkelig.