0Pricing
SQL Academy · Урок

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 — локальная установка не требуется.

Все уроки этого курса

  1. Что на самом деле означает NULL
  2. IS NULL и IS NOT NULL
  3. COALESCE и NULLIF
  4. NULL в агрегатах и объединениях
← Назад к SQL Academy