Как уже говорили другие, NVL может быть каскадным, но предпочтительным решением будет вместо этого использовать COALESCE. Однако две функции не являются полностью взаимозаменяемыми:
1) как уже упоминалось, COALESCE оценивает аргументы только от первого до тех пор, пока не встретит аргумент, который не оценивается как ноль
2) однако COALESCE требует, чтобы все аргументы были одного и того же типа данных, поэтому STRICTER , чем NVL, который сначала попытается выполнить неявное преобразование.
1009 * Е.Г. *
SELECT COALESCE( 1.5 / NULL,
SUM(NULL),
TO_CHAR(SYSDATE, 'YYYY') ) abc
FROM DUAL
на самом деле выдает ошибку ORA-00932: inconsistent datatypes: expected NUMBER got CHAR
Вместо этого NVL вернет текущий год
SELECT NVL( 1.5 / NULL,
NVL( SUM(NULL),
TO_CHAR(SYSDATE, 'YYYY') ) ) abc
FROM DUAL
Другие примеры:
select coalesce('some text',sysdate) from dual;
бросает ORA-00932: inconsistent datatypes: expected CHAR got DATE
, а
select nvl('some text',sysdate) from dual;
возвращает some text
, но
select nvl(sysdate,'some text') from dual;
бросает ORA-01841: (full) year must be between -4713 and +9999, and not be 0
(поскольку неявная попытка преобразования «некоторого текста» в дату не удалась)