Условие
Какие функции в PostgreSQL помогают обрабатывать NULL? Что вернёт NULLIF(10, 10)?
Решение
Две главные функции
| Функция | Что делает | Пример |
|---|---|---|
COALESCE(a, b, c, ...) |
Первое НЕ-NULL значение из списка | COALESCE(NULL, NULL, 5) → 5 |
NULLIF(a, b) |
NULL, если a = b, иначе a |
NULLIF(10, 10) → NULL |
COALESCE
-- замена NULL на 0 в зарплате
SELECT id, name, COALESCE(salary, 0) AS salary
FROM employees;
-- цепочка fallback'ов
SELECT COALESCE(work_phone, mobile_phone, home_phone, 'no phone')
FROM contacts;NULLIF — обратная операция
NULLIF(a, b) превращает «маркерное значение» обратно в NULL. Главные сценарии:
-- защита от деления на ноль
SELECT revenue / NULLIF(orders, 0) AS aov
FROM sales;
-- если в данных пустая строка вместо NULL
SELECT NULLIF(name, '') AS name
FROM raw_clients;Пара COALESCE + NULLIF
Эта связка — рабочая лошадка очистки данных:
-- '' → NULL → 'unknown'
SELECT COALESCE(NULLIF(city, ''), 'unknown') FROM clients;Что вернёт NULLIF(NaN::numeric, NaN::numeric)
В PostgreSQL — NULL, потому что NaN = NaN в numeric считается истинным (особенность PG, в отличие от IEEE 754).
Подводные камни
COALESCE(a, b)≠ISNULL(a, b)— последний есть в SQL Server, в PostgreSQL его нет; используйте COALESCE.- Тип возвращаемого значения —
COALESCE(NULL, '0')вернёт строку, не число. Аргументы должны быть совместимых типов. NULLIFвSUM—SUM(NULLIF(x, 0))сложит только ненулевые, потому что NULL пропускается агрегатами.COALESCE(NaN, 0)вnumericвернётNaN, не0, потому чтоNaN— это валидное значение, не NULL.
Эталонный ответ
COALESCE возвращает первое не-NULL из аргументов. NULLIF(a, b) возвращает NULL, если a = b. NULLIF(10, 10) = NULL.