четверг, 18 марта 2010 г.

Использование функции NULLIF

Существует интересная, но малоизвестная функция NULLIF.


Выдержка из документации:
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;

Источник.

Комментариев нет:

Отправить комментарий