COALESCE
е по-модерна функция, която е част от ANSI-92
стандартно.
NVL
е Oracle
специфично, той беше въведен в 80
е преди да има някакви стандарти.
В случай на две стойности те са синоними.
Те обаче се изпълняват по различен начин.
NVL
винаги оценява и двата аргумента, докато COALESCE
обикновено спира оценката, когато открие първия не-NULL
(има някои изключения, като последователност NEXTVAL
):
SELECT SUM(val)
FROM (
SELECT NVL(1, LENGTH(RAWTOHEX(SYS_GUID()))) AS val
FROM dual
CONNECT BY
level <= 10000
)
Това работи за почти 0.5
секунди, тъй като генерира SYS_GUID()
's, въпреки 1
не е NULL
.
SELECT SUM(val)
FROM (
SELECT COALESCE(1, LENGTH(RAWTOHEX(SYS_GUID()))) AS val
FROM dual
CONNECT BY
level <= 10000
)
Това разбира, че 1
не е NULL
и не оценява втория аргумент.
SYS_GUID
's не се генерират и заявката е мигновена.