JavaRush /Курсы /SQL SELF /Обработка NULL в расчетах с COALESCE()

Обработка NULL в расчетах с COALESCE()

SQL SELF
9 уровень , 3 лекция
Открыта

Сегодня мы опять углубимся в тему обработки NULL и познакомимся с очень полезной функцией — COALESCE(). Эта функция позволяет элегантно справляться с NULL значениями в ваших данных.

Рассмотрим следующий пример: у вас есть таблица с данными о сотрудниках, но у некоторых сотрудников отсутствует информация о зарплате. Что будет, если мы попытаемся увеличить все зарплаты? Ничего хорошего. Ведь нельзя проводить операции с NULL. А что если мы хотим заменить NULL зарплаты на, скажем, 0? Здесь на сцену выходит COALESCE().

COALESCE() — это функция, которая возвращает первое не-NULL значение из переданного списка аргументов. Если все значения в списке равны NULL, функция возвращает NULL. Простыми словами, она говорит: "Дайте мне первое адекватное значение, которое вы можете найти, пожалуйста!"

Синтаксис

COALESCE(value1, value2, ..., value_n)

value1, value2, ..., value_n — это аргументы, которые вы передаете функции. Она вернёт первое значение, которое не равно NULL.

Примеры работы COALESCE()

Приведём парочку примеров.

Пример 1: Заменяем NULL на 0

Предположим, у нас есть таблица salaries:

id name salary
1 Otto 50000
2 Maria NULL
3 Alex 60000
4 Anna NULL

Мы хотим посчитать общую сумму зарплат - это просто сделать:

SELECT SUM(salary) AS total_salary
FROM salaries;

Функция SUM() игнорирует NULL, так что проблем нет.

Но затем мы хотим посчитать общую сумму зарплат, если дадим каждому сотруднику премию в 1000.

SELECT SUM(salary+1000) AS total_salary
FROM salaries;

Считаем по строкам: 51000 + NULL + 61000 + NULL — поскольку NULL + 1000 = NULL, а SUM игнорирует NULL, на выходе получим 112000. Премия достанется только тем, у кого salary уже была указана; «безсолевых» сотрудников запрос обойдёт стороной.

Если мы хотим, чтобы премия в 1000 досталась всем (включая тех, у кого зарплата не указана), нужно сначала заменить NULL на 0 через COALESCE:

SELECT SUM(COALESCE(salary, 0) + 1000) AS total_salary
FROM salaries;

Теперь считаем: 51000 + 1000 + 61000 + 1000 = 114000. Это две разные бизнес-задачи (а не «правильный» и «неправильный» запрос) — выбирайте формулу в зависимости от того, кому реально полагается премия.

Результат:

total_salary
114000

Пример 2: Заменяем NULL на значение по умолчанию

Допустим, у нас есть таблица students с именами и адресами:

id name address
1 Anna Kanne
2 Peter NULL
3 Lisa Painful
4 Alex NULL

Мы хотим заменить NULL в адресах на "Не указано":

SELECT name, COALESCE(address, 'Не указано') AS resolved_address
FROM students;

Результат запроса:

name resolved_address
Anna Kanne
Peter Не указано
Lisa Painful
Alex Не указано

Пример 3: Использование нескольких значений

Иногда бывает, что NULL нужно заменить не одним значением, а целым рядом значений. Например, мы хотим выбирать имя, имя для друзей или использовать "Без имени", если ни одно из них не задано. Таблица users:

user_id first_name short_name full_name
1 John Jonny Johnny Walker
2 NULL Pete Peter Kamen
3 NULL NULL

Запрос:

SELECT user_id,
       COALESCE(first_name, short_name, 'Без имени') AS display_name
FROM users;

Результат:

user_id display_name
1 John
2 Pete
3 Без имени

Практическое применение COALESCE()

На практике COALESCE() — это спасательный круг для работы с неидеальными данными.

Посмотрим, как он помогает в различных задачах.

Пример 1: Замена значений в текстовых полях

Исходная таблица customers:

id name address
1 Alex Lin 123 Maple St
2 Maria Chi NULL
3 Anna Song 456 Oak Ave
4 Otto Art NULL
5 Liam Park 789 Pine Rd

Запрос:

SELECT name, COALESCE(address, 'Не указано') AS address
FROM customers;

Результат:

name address
Alex Lin 123 Maple St
Maria Chi Не указано
Anna Song 456 Oak Ave
Otto Art Не указано
Liam Park 789 Pine Rd

Пример 2: Подготовка данных для отчетов

Исходная таблица sales:

id product price
1 Widget A 100
2 Widget B NULL
3 Widget C 250
4 Widget D NULL
5 Widget E 300

Запрос:

SELECT SUM(COALESCE(price, 0)) AS total_sales
FROM sales;

Результат:

total_sales
650

Типичные ошибки при использовании COALESCE()

Хотя COALESCE() кажется простой и универсальной функцией, с ней можно столкнуться с несколькими подводными камнями.

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

-- Ошибка
SELECT COALESCE(salary, 'Не указано') FROM employees; 
-- salary — числовое поле, а 'Не указано' — текст.

Пренебрежение порядком аргументов. COALESCE() возвращает первое не-NULL значение, поэтому порядок аргументов играет важную роль.

2
Задача
SQL SELF, 9 уровень, 3 лекция
Недоступна
Замена NULL значений на значение по умолчанию
Замена NULL значений на значение по умолчанию
2
Задача
SQL SELF, 9 уровень, 3 лекция
Недоступна
Замена NULL значений с несколькими уровнями приоритетов
Замена NULL значений с несколькими уровнями приоритетов
Комментарии (4)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Gans Electro Уровень 26
14 июня 2026

Все аргументы, передаваемые в COALESCE(), должны быть совместимы по типу данных.
Не знал
Euraks Уровень 21
6 июня 2026
🦔
Вячеслав Уровень 10
8 июля 2025
В первом примере куда результат начинает плыть? Каким стилем? Почему нет результата заплыва? А вот результат применения COALESCE там же неочевиден, т. к. возвращает то же, что и без. Нужно сравнение результатов при ДОБАВЛЕНИИ премии. А нет ни одного из двух.
ТимБай Уровень 59
10 мая 2026
тут все не нормально, зря это кур купил