COALESCE и NULLIF
Задавайте значения по умолчанию и избегайте деления на ноль
«COALESCE и NULLIF» — бесплатный урок SQL Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Замена отсутствующих значений
Обнаружить NULL — это только половина задачи: часто требуется заменить их разумным значением по умолчанию. Функция SQL COALESCE делает именно это.
А когда нужно намеренно создать NULL (например, чтобы избежать деления на ноль), используется NULLIF. В этом уроке рассматриваются оба случая.
-- Show a placeholder when phone is missing
SELECT name, COALESCE(phone, 'no phone on file') AS phone
FROM customers;Как работает COALESCE
COALESCE принимает любое количество аргументов и возвращает первый не равный NULL — слева направо.
Если все аргументы равны NULL, результатом будет NULL. Представьте это так: «используйте это, или то, или, наконец, резервное значение».
SELECT
COALESCE(NULL, NULL, 'third', 'fourth') AS a, -- 'third'
COALESCE(NULL, 42) AS b, -- 42
COALESCE(NULL, NULL) AS c; -- NULLЦепочка резервных значений
Поскольку COALESCE принимает много аргументов, с его помощью можно выстроить цепочку предпочтений.
Например, сначала выбрать мобильный номер, затем рабочий, потом домашний и наконец готовое текстовое сообщение.
SELECT name,
COALESCE(mobile, work_phone, home_phone, 'unreachable') AS best_contact
FROM contacts;Значения по умолчанию в вычислениях
NULL распространяется по арифметическим операциям, поэтому одного отсутствующего значения достаточно, чтобы результатом всего вычисления стал NULL. Оберните входное значение, которое может быть NULL, в COALESCE, чтобы подставить нейтральное значение.
Здесь вместо отсутствующей скидки используется 0.
-- Without COALESCE, a NULL discount makes total NULL
SELECT
price - COALESCE(discount, 0) AS total
FROM line_items;Правила типов для COALESCE
Все аргументы COALESCE должны иметь совместимые типы. PostgreSQL выбирает общий тип и выдаёт ошибку, если это невозможно.
Например, нельзя смешать число и строку произвольного текста без явного приведения типов — резервное значение тоже должно быть числом.
-- OK: both integers
SELECT COALESCE(score, 0) FROM results;
-- Cast when mixing types
SELECT COALESCE(score::text, 'n/a') FROM results;Знакомство с NULLIF
NULLIF(a, b) по смыслу выполняет действие, обратное COALESCE: возвращает NULL, когда a = b, а в противном случае возвращает a.
Это краткий способ превратить конкретное «сигнальное» значение в настоящий NULL.
SELECT
NULLIF(5, 5) AS a, -- NULL (equal)
NULLIF(5, 9) AS b, -- 5 (not equal)
NULLIF('', '') AS c; -- NULL (treat empty string as missing)NULLIF для защиты от деления на ноль
Классический случай применения NULLIF — предотвращение ошибок деления. Деление на 0 вызывает ошибку, а деление на NULL просто даёт результатом NULL.
Оберните делитель в NULLIF(divisor, 0), чтобы вместо сбоя получить безопасный NULL.
-- If total_visits is 0, this would error.
-- NULLIF turns the divisor into NULL, giving a NULL ratio instead.
SELECT
conversions / NULLIF(total_visits, 0) AS conversion_rate
FROM campaigns;Сочетание NULLIF и COALESCE
NULLIF и COALESCE отлично дополняют друг друга. Используйте NULLIF, чтобы превратить сигнальное значение в NULL, а затем COALESCE, чтобы заменить этот NULL удобным значением по умолчанию.
Здесь пустая строка в примечании превращается в буквальный текст «—».
-- Treat '' as missing, then display a dash
SELECT
COALESCE(NULLIF(note, ''), '—') AS display_note
FROM tickets;Безопасное среднее отношение
Объединим всё в надёжном аналитическом запросе: защитимся от деления на ноль с помощью NULLIF, а затем выведем 0 вместо NULL с помощью COALESCE.
Запрос никогда не выдаёт ошибку и всегда показывает корректное число.
SELECT
product_id,
COALESCE(returns / NULLIF(orders, 0), 0) AS return_rate
FROM product_stats;COALESCE и IS NULL
Оба средства работают с NULL, но служат разным целям:
IS NULL/IS NOT NULL— проверять отсутствие значений в условии.COALESCE— подставлять значение в результат.
Используйте COALESCE при формировании результатов, а IS NULL — при фильтрации.
-- Filter (IS NULL)
SELECT * FROM customers WHERE phone IS NULL;
-- Substitute (COALESCE)
SELECT COALESCE(phone, 'unknown') FROM customers;Объединяем всё вместе
Краткая памятка по этому уроку:
COALESCE(a, b, c)→ первое значение, не равное NULL.NULLIF(a, b)→ NULL, если значения равны, иначеa.- Используйте
NULLIF(divisor, 0), чтобы избежать деления на ноль. - Используйте
COALESCE, чтобы задавать значения по умолчанию в вычислениях и результатах.
SELECT
COALESCE(nickname, full_name, 'guest') AS display_name,
revenue / NULLIF(orders, 0) AS avg_order_value
FROM accounts;Быстрая проверка
Что возвращает NULLIF(amount, 0), если значение amount равно 0?
Итоги
Теперь вы умеете заменять NULL значениями по умолчанию с помощью COALESCE (побеждает первое значение, не равное NULL) и намеренно создавать NULL с помощью NULLIF (NULL возвращается, когда два значения совпадают).
Вы рассмотрели способ защиты от деления на ноль и узнали, как объединять обе функции для получения безопасного и аккуратного результата. Далее вы изучите поведение NULL внутри COUNT, SUM и JOIN.
SELECT
COALESCE(NULLIF(comment, ''), 'no comment') AS comment,
total / NULLIF(qty, 0) AS unit_price
FROM invoices;Часто задаваемые вопросы
Урок «COALESCE и NULLIF» бесплатный?
Да — полный текст урока «COALESCE и NULLIF» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «COALESCE и NULLIF»?
Задавайте значения по умолчанию и избегайте деления на ноль Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «COALESCE и NULLIF»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Что на самом деле означает NULL
- IS NULL и IS NOT NULL
- COALESCE и NULLIF
- NULL в агрегатах и объединениях