COALESCE: замена NULL на заданное значение

Что такое COALESCE и зачем он нужен? 🤔

NULL в SQL — это не просто пустое значение, а специальный маркер отсутствия данных. И когда NULL попадает в ваши вычисления или отчёты, это может вызвать неожиданные проблемы.

COALESCE приходит на помощь! Это функция, которая:

  1. Принимает список значений
  2. Возвращает первое не-NULL значение из списка
  3. Если все значения 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() в Oracle
  • IFNULL() в MySQL

Реальный пример из практики 🏢

Представьте отчёт по продажам, где некоторые регионы ещё не отправили данные:

SELECT 
    region,
    COALESCE(
        sales_amount, 
        (SELECT AVG(sales_amount) FROM sales WHERE region != s.region),
        0
    ) AS reported_sales
FROM sales s;

Здесь мы:

  1. Берём фактические продажи, если они есть
  2. Если нет — используем среднее по другим регионам
  3. В крайнем случае — 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! 😉

Скрыть рекламу навсегда

🎥 YouTube: программирование простым языком

Канал, где я спокойно и по шагам объясняю сложные темы — без заумных терминов и лишней теории.

Подходит, если раньше «не заходило», но хочется наконец понять.

▶️ Смотреть курсы на YouTube