Собесов

Работа с NULL: COALESCE и NULLIF

SQLNULL и трёхзначная логикаЛёгкаяJunior

Условие

Какие функции в 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).

Подводные камни

  1. COALESCE(a, b)ISNULL(a, b) — последний есть в SQL Server, в PostgreSQL его нет; используйте COALESCE.
  2. Тип возвращаемого значенияCOALESCE(NULL, '0') вернёт строку, не число. Аргументы должны быть совместимых типов.
  3. NULLIF в SUMSUM(NULLIF(x, 0)) сложит только ненулевые, потому что NULL пропускается агрегатами.
  4. COALESCE(NaN, 0) в numeric вернёт NaN, не 0, потому что NaN — это валидное значение, не NULL.

Эталонный ответ

COALESCE возвращает первое не-NULL из аргументов. NULLIF(a, b) возвращает NULL, если a = b. NULLIF(10, 10) = NULL.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти