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.