Сегодня мы опять углубимся в тему обработки 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 значение, поэтому порядок аргументов играет важную роль.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ