COALESCE: замена NULL на заданное значение
Что такое COALESCE и зачем он нужен? 🤔
NULL в SQL — это не просто пустое значение, а специальный маркер отсутствия данных. И когда NULL попадает в ваши вычисления или отчёты, это может вызвать неожиданные проблемы.
COALESCE приходит на помощь! Это функция, которая:
- Принимает список значений
- Возвращает первое не-NULL значение из списка
- Если все значения NULL — вернёт NULL
Проще говоря: COALESCE — это "запасной парашют" для ваших запросов!
Базовый синтаксис ✍️
COALESCE(value1, value2, ..., valueN)
Работает во всех популярных СУБД: PostgreSQL, MySQL, SQL Server, Oracle и других.
Простые примеры для понимания
Пример 1: Замена NULL на текст
SELECT
product_name,
COALESCE(description, 'Описание отсутствует') AS description
FROM products;
Если description равен NULL, пользователь увидит понятную фразу вместо непонятного пустого поля.
Пример 2: Вычисления с NULL
SELECT
order_id,
quantity,
price,
COALESCE(quantity * price, 0) AS total -- избегаем NULL в вычислениях
FROM order_items;
Без COALESCE при NULL в quantity или price весь результат стал бы NULL, что явно не то, что мы хотим!
Продвинутые сценарии использования 🚀
Цепочка замены
COALESCE может проверять несколько столбцов подряд:
SELECT
employee_id,
COALESCE(work_phone, mobile_phone, home_phone, 'Контакт не указан') AS contact_phone
FROM employees;
Этот запрос проверит телефоны в порядке приоритета и вернёт первый существующий.
COALESCE в условиях WHERE
SELECT
customer_name,
last_purchase_date
FROM customers
WHERE last_purchase_date >= COALESCE(:input_date, '2000-01-01');
Если пользователь не указал дату (:input_date IS NULL), используется дата по умолчанию.
Особенности работы ⚠️
1. Типы данных: COALESCE возвращает значение того же типа, что и первый не-NULL аргумент
COALESCE(NULL, 5, 10.5) → вернёт 5 (INTEGER), а не 5.0
2. Производительность: COALESCE останавливается на первом не-NULL значении, что эффективно
3. Альтернатива: В некоторых СУБД есть аналогичные функции:
ISNULL()в SQL Server (только 2 параметра)NVL()в OracleIFNULL()в MySQL
Реальный пример из практики 🏢
Представьте отчёт по продажам, где некоторые регионы ещё не отправили данные:
SELECT
region,
COALESCE(
sales_amount,
(SELECT AVG(sales_amount) FROM sales WHERE region != s.region),
0
) AS reported_sales
FROM sales s;
Здесь мы:
- Берём фактические продажи, если они есть
- Если нет — используем среднее по другим регионам
- В крайнем случае — 0
COALESCE vs CASE: когда что использовать?
COALESCE — это фактически сокращение для простого CASE:
COALESCE(a, b, c)
-- Эквивалентно:
CASE
WHEN a IS NOT NULL THEN a
WHEN b IS NOT NULL THEN b
ELSE c
END
Выбирайте COALESCE для простых проверок, CASE — для сложной логики.
Практическое задание 🛠️
Попробуйте решить проблему: в таблице users некоторые email равны NULL, а у некоторых пользователей заполнены как пустые строки (''). Напишите запрос, который возвращает:
- email, если он валидный
- строку "no-email", если email NULL или пустой
-- Ваше решение здесь
-- Подсказка: NULL и пустая строка — разные вещи!
COALESCE — это ваш верный инструмент для борьбы с NULL-значениями! Освоив его, вы сделаете свои запросы устойчивее, а отчёты — понятнее для пользователей.
Когда в следующий раз увидите NULL в своих данных — вспомните про COALESCE! 😉