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;

И результат начинает плыть. Лучше всего было сразу избавиться он NULL значений с помощью функции COALESCE и заменить их на 0. Посмотрим, как это сделать:

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

Результат:

total_salary
110000

Так лучше и надежнее.

Пример 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 значений с несколькими уровнями приоритетов
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Вячеслав Уровень 10
8 июля 2025
В первом примере куда результат начинает плыть? Каким стилем? Почему нет результата заплыва? А вот результат применения COALESCE там же неочевиден, т. к. возвращает то же, что и без. Нужно сравнение результатов при ДОБАВЛЕНИИ премии. А нет ни одного из двух.