Выдержка из документации:
NULLIF compares expr1 and expr2. If they are equal, then the function returns null. If they are not equal, then the function returns expr1. You cannot specify the literal NULL for expr1.
If both arguments are numeric datatypes, then Oracle Database determines the argument with the higher numeric precedence, implicitly converts the other argument to that datatype, and returns that datatype. If the arguments are not numeric, then they must be of the same datatype, or Oracle returns an error.
The NULLIF function is logically equivalent to the following CASE expression:
CASE WHEN expr1 = expr 2 THEN NULL ELSE expr1 END
Там же приведен поясняющий пример (показать должность работников, у которых было продвижение по службе):
Это все очень хорошо, но какие еще могут быть применения для этой функции?SELECT e.last_name, NULLIF(e.job_id, j.job_id) "Old Job ID" FROM employees e, job_history j WHERE e.employee_id = j.employee_id ORDER BY last_name; LAST_NAME Old Job ID ------------------------- ---------- De Haan AD_VP Hartstein MK_MAN Kaufling ST_MAN Kochhar AD_VP Kochhar AD_VP Raphaely PU_MAN Taylor SA_REP Taylor Whalen AD_ASST Whalen
Как насчет того что запись о сотруднике имеет два поля ввода для почтового адреса. Первое поле сохраняем по умолчанию, а второе сохраняем только если адрес в нем отличается от первого, иначе вернуть null. Вот как это можно запрограммировать оператороми CASE и DECODE:
CASE WHEN email_address != email_address_alternate THEN email_address_alternate ELSE null END email_address_alternate DECODE(email_address, email_address_alternate, null, email_address_alternate) email_address_alternateА вот как будет выглядеть та же логика, но записанная функцией NULLIF:
NULLIF(email_address_alternate, email_address)А может вам необходимо выполнить загрузку данных, и при этом нужно игнорировать некоторые данные по условию:
NULLIF(surname, 'INACTIVE')Последний предлагаемый вариант использования - старая математическая проблема, деление на ноль (dividing by zero).
В обычном случае мы получим ошибку:
select 1/0 from dual * ERROR at line 1: ORA-01476: divisor is equal to zeroМы можем заставить вернуть null, когда цена равна нулю, чтобы избежать ошибки:
SELECT (price-cost)/NULLIF(price,0) gp FROM sales;
Источник.
Комментариев нет:
Отправить комментарий