COALESCE
is een modernere functie die deel uitmaakt van ANSI-92
standaard.
NVL
is Oracle
specifiek, het werd geïntroduceerd in 80
's voordat er normen waren.
In het geval van twee waarden zijn het synoniemen.
Ze worden echter anders geïmplementeerd.
NVL
evalueert altijd beide argumenten, terwijl COALESCE
stopt meestal de evaluatie wanneer het de eerste niet-NULL
. vindt (er zijn enkele uitzonderingen, zoals volgorde NEXTVAL
):
SELECT SUM(val)
FROM (
SELECT NVL(1, LENGTH(RAWTOHEX(SYS_GUID()))) AS val
FROM dual
CONNECT BY
level <= 10000
)
Dit duurt bijna 0.5
seconden, omdat het SYS_GUID()
. genereert 's, ondanks 1
geen NULL
zijn .
SELECT SUM(val)
FROM (
SELECT COALESCE(1, LENGTH(RAWTOHEX(SYS_GUID()))) AS val
FROM dual
CONNECT BY
level <= 10000
)
Dit begrijpt dat 1
is geen NULL
en evalueert het tweede argument niet.
SYS_GUID
's worden niet gegenereerd en de zoekopdracht is direct.