0Pricing
Coding Interview Prep · Урок

COALESCE, NULLIF и ISNULL

Подставляйте значения по умолчанию и разбирайтесь в различиях между COALESCE и функциями конкретных поставщиков.

«COALESCE, NULLIF и ISNULL» — бесплатный урок Coding Interview Prep на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Coding Interview Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Coding Interview Prep содержит 4 уроков всего.

Подстановка значений вместо NULL

Теперь, когда вы умеете обнаруживать NULL, следующий навык для собеседования — заменять его разумным значением по умолчанию. Переносимый стандартный инструмент для этого — COALESCE.

Кроме него, вы познакомитесь с NULLIF, который действует в обратном направлении, превращая определённое значение в NULL, а также с функциями конкретных СУБД ISNULL (SQL Server) и IFNULL (MySQL), которые кандидаты часто путают с COALESCE.

Точное понимание различий между ними, особенно количества аргументов и возвращаемого типа, — частый вопрос на первичном отборе.

Основы COALESCE

COALESCE принимает любое количество аргументов и возвращает первый аргумент, не равный NULL, просматривая их слева направо. Если все аргументы равны NULL, возвращается NULL.

Это стандарт ANSI, работающий во всех основных СУБД, поэтому именно его следует использовать по умолчанию. С его помощью можно задавать резервные значения для отображения, вычислений или группировки.

-- Show 0 instead of NULL for missing bonuses
SELECT name, COALESCE(bonus, 0) AS bonus
FROM employees;

-- Multiple fallbacks, first non-NULL wins
SELECT COALESCE(mobile_phone, home_phone, 'no phone') AS contact
FROM customers;

COALESCE работает с коротким замыканием

Важная деталь, которую проверяют интервьюеры: COALESCE концептуально вычисляет аргументы слева направо и останавливается на первом, не равном NULL. Поэтому более позднее затратное выражение не требуется, когда более раннее уже дало результат.

На практике оптимизаторы некоторых СУБД всё же могут вычислять аргументы заранее, поэтому не полагайтесь на это поведение как на защиту от ошибок, например деления на ноль. Но порядок слева направо, определяющий, какое значение будет выбрано, гарантирован.

-- Prefer the manual override, else the computed value,
-- else a constant default
SELECT COALESCE(manual_price, list_price * 1.1, 9.99) AS price
FROM products;

COALESCE и тип результата

Важная тонкость: тип данных результата COALESCE определяется приоритетом типов всех аргументов вместе, а не только первого. Смешивание несовместимых типов может привести к ошибкам или неожиданному усечению.

Например, COALESCE для столбца целого типа и строкового значения по умолчанию может завершиться ошибкой или привести тип неявно — это зависит от СУБД. Интервьюеры используют это, чтобы проверить, думаете ли вы о типах.

-- Risky: integer column with a string fallback
-- may error or force a cast depending on dialect
SELECT COALESCE(score, 'N/A') FROM tests;

-- Safer: keep the fallback type-compatible, or cast explicitly
SELECT COALESCE(CAST(score AS VARCHAR), 'N/A') FROM tests;

ISNULL (SQL Server) и COALESCE

В SQL Server есть ISNULL(expr, replacement). Эта функция похожа на COALESCE, но отличается в важных аспектах, которые интервьюеры любят сравнивать:

  • Количество аргументов: ISNULL принимает ровно два, а COALESCE — много.
  • Возвращаемый тип: ISNULL использует тип первого аргумента, из-за чего значение-замена может быть усечено. COALESCE использует совокупный приоритет типов.
  • Переносимость: ISNULL доступна только в SQL Server, а COALESCE — стандарт ANSI.

Рекомендация, которую стоит озвучить: для переносимости и предсказуемой типизации отдавайте предпочтение COALESCE.

-- SQL Server: ISNULL may truncate the replacement to
-- the first argument's type (e.g. CHAR(1))
SELECT ISNULL(code, 'UNKNOWN') FROM items;
-- If code is CHAR(1), 'UNKNOWN' becomes 'U'

-- COALESCE picks the wider type and keeps 'UNKNOWN'
SELECT COALESCE(code, 'UNKNOWN') FROM items;

IFNULL и NVL

У других диалектов есть собственные сокращённые формы с двумя аргументами:

  • MySQL / SQLite: IFNULL(expr, replacement)
  • Oracle: NVL(expr, replacement), плюс NVL2 для варианта «если ..., то ..., иначе ...»

Все три ведут себя как COALESCE с двумя аргументами. Если спрашивают именно о принятом в MySQL или Oracle варианте, назовите эти функции; в остальных случаях используйте COALESCE.

-- MySQL
SELECT IFNULL(bonus, 0) FROM employees;

-- Oracle
SELECT NVL(bonus, 0) FROM employees;
-- NVL2(bonus, 'has bonus', 'no bonus') -> if/else on NULL

NULLIF: обратное направление

NULLIF(a, b) возвращает NULL, когда a = b, в противном случае возвращает a. Эта функция намеренно создаёт NULL, то есть действует противоположно COALESCE.

Обычно её используют для защиты от деления на ноль. Оберните знаменатель в NULLIF(denominator, 0): если он равен нулю, делитель становится NULL, и всё деление возвращает NULL вместо ошибки.

-- Avoid divide-by-zero: returns NULL instead of erroring
SELECT revenue / NULLIF(orders, 0) AS avg_order_value
FROM daily_stats;

-- NULLIF(5, 5) -> NULL
-- NULLIF(5, 3) -> 5

Объединение NULLIF и COALESCE

Эти две функции отлично сочетаются. Классический однострочный ответ на собеседовании — «безопасное деление, отображающее 0, когда заказов нет». Используйте NULLIF, чтобы избежать ошибки, затем COALESCE, чтобы заменить получившийся NULL.

Этот компактный приём показывает уверенное владение темой: вы обрабатываете граничный случай и представление результата в одном выражении.

SELECT
  COALESCE(revenue / NULLIF(orders, 0), 0) AS avg_order_value
FROM daily_stats;

-- orders = 0 -> NULLIF gives NULL -> division gives NULL
-- -> COALESCE turns it into 0

Преобразование пустых строк в NULL

Ещё одно практическое применение NULLIF: преобразование пустых строк в NULL, чтобы затем обрабатывать их единообразно с помощью COALESCE. В неочищенных данных часто встречаются и NULL, и ''; это приводит оба случая к единому виду.

Читайте шаблон так: «если значение пустое, сделайте его NULL, затем используйте значение по умолчанию». Это чёткий переносимый ответ на вопрос «как обрабатывать пустые и отсутствующие значения одинаково?»

-- Treat both '' and NULL as missing, default to 'Anonymous'
SELECT COALESCE(NULLIF(TRIM(username), ''), 'Anonymous')
FROM users;

Более подробный пример: объединение значений через JOIN

После LEFT JOIN несопоставленные строки дают NULL в правой части. COALESCE превращает их в осмысленные значения по умолчанию в результате — это очень распространённое требование к отчётам.

Здесь клиенты без заказов всё равно отображаются (благодаря LEFT JOIN), а их итог равен 0, а не NULL. Упоминание о том, что COALESCE выполняется после соединения, а не внутри него, показывает понимание порядка вычисления.

SELECT
  c.name,
  COALESCE(SUM(o.amount), 0) AS total_spent
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;
-- Customers with no orders get 0 instead of NULL

Основные тезисы для собеседования

Краткое изложение инструментов подстановки:

  • COALESCE(a, b, ...): первый аргумент, не равный NULL; много аргументов; стандарт ANSI; тип определяется приоритетом. Основной выбор.
  • ISNULL / IFNULL / NVL: сокращённые формы СУБД с двумя аргументами; ISNULL может усечь значение до типа первого аргумента.
  • NULLIF(a, b): возвращает NULL при равенстве; отлично подходит для защиты от деления на ноль и нормализации пустых строк.
  • Сочетайте COALESCE(x / NULLIF(y, 0), 0) для безопасного и пригодного для вывода деления.

Начинайте с COALESCE и упоминайте варианты конкретных СУБД только тогда, когда диалект определён.

Быстрая проверка

Выберите выражение для безопасного деления.

Итоги

Теперь вы умеете подставлять значения вместо NULL и создавать NULL:

  • COALESCE возвращает первый аргумент, не равный NULL, из произвольного количества аргументов; это переносимый вариант по умолчанию.
  • ISNULL (SQL Server), IFNULL (MySQL) и NVL (Oracle) — сокращённые формы с двумя аргументами; ISNULL может усечь значение до типа первого аргумента.
  • NULLIF(a, b) возвращает NULL, когда два значения равны; идеально подходит для защиты от деления на ноль и нормализации пустых строк.
  • Сочетайте их для безопасных, пригодных для вывода выражений и для подстановки значений по умолчанию вместо NULL после LEFT JOIN.

Заключительный урок: как NULL ведёт себя внутри агрегатных функций, соединений и DISTINCT.

Часто задаваемые вопросы

Урок «COALESCE, NULLIF и ISNULL» бесплатный?

Да — полный текст урока «COALESCE, NULLIF и ISNULL» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Coding Interview Prep, подпишись на CoddyKit PRO. Курс Coding Interview Prep содержит 4 уроков всего.

Чему я научусь в уроке «COALESCE, NULLIF и ISNULL»?

Подставляйте значения по умолчанию и разбирайтесь в различиях между COALESCE и функциями конкретных поставщиков. Ты практикуешь Coding Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Coding Interview Prep?

Предыдущий опыт не требуется. Coding Interview Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «COALESCE, NULLIF и ISNULL»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Coding Interview Prep?

Да. Каждый урок Coding Interview Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

  1. Трёхзначная логика и UNKNOWN
  2. IS NULL, IS NOT NULL и безопасное сравнение с NULL
  3. COALESCE, NULLIF и ISNULL
  4. NULL в агрегатах, объединениях и DISTINCT
← Назад к Coding Interview Prep