COALESCE är en modernare funktion som är en del av ANSI-92 standard.
NVL är Oracle specifikt introducerades det i 80 innan det fanns några standarder.
Om det finns två värden är de synonymer.
De implementeras dock annorlunda.
NVL utvärderar alltid båda argumenten, medan COALESCE stoppar vanligtvis utvärderingen när den hittar den första icke-NULL (det finns några undantag, som sekvensen NEXTVAL ):
SELECT SUM(val)
FROM (
SELECT NVL(1, LENGTH(RAWTOHEX(SYS_GUID()))) AS val
FROM dual
CONNECT BY
level <= 10000
)
Detta körs i nästan 0.5 sekunder, eftersom den genererar SYS_GUID() s, trots 1 är inte en NULL .
SELECT SUM(val)
FROM (
SELECT COALESCE(1, LENGTH(RAWTOHEX(SYS_GUID()))) AS val
FROM dual
CONNECT BY
level <= 10000
)
Detta förstår att 1 är inte en NULL och utvärderar inte det andra argumentet.
SYS_GUID s genereras inte och frågan är omedelbar.