Работа с NULL встречается в самых разных сценариях: от обработки отсутствующих данных в отчетах до фильтрации и сортировки. Если бы был выбор между отсутствием значения в таблице и странным числом вроде 9999, большинство выбрало бы NULL — да, согласен, что это не самое удобное, но зато честно. Рассмотрим несколько типичных кейсов.
Пример: сортировка товаров с отсутствующими ценами
Представим, что мы управляем интернет-магазином, и у нас есть таблица товаров:
| product_id | name | price |
|---|---|---|
| 1 | Телефон | 45000 |
| 2 | Ноутбук | NULL |
| 3 | Камера | 25000 |
| 4 | Умные часы | NULL |
Мы хотим отсортировать товары по цене, при этом товары без цены (NULL) должны идти в конце.
SELECT product_id, name, price
FROM products
ORDER BY price ASC NULLS LAST;
Результат:
| product_id | name | price |
|---|---|---|
| 3 | Камера | 25000 |
| 1 | Телефон | 45000 |
| 2 | Ноутбук | NULL |
| 4 | Умные часы | NULL |
Обратите внимание на ключевую конструкцию NULLS LAST. По умолчанию PostgreSQL для ASC помещает NULL значения в начало, но с этим параметром мы перемещаем их в конец.
Пример: фильтрация студентов без даты рождения
У нас есть таблица студентов, и мы хотим выбрать только тех, у которых не указана дата рождения.
| student_id | name | birth_date |
|---|---|---|
| 1 | Otto Art | 2000-01-15 |
| 2 | Anna Song | NULL |
| 3 | Alex Lin | 1999-05-10 |
| 4 | Maria Chi | NULL |
Запрос:
SELECT student_id, name
FROM students
WHERE birth_date IS NULL;
Результат:
| student_id | name |
|---|---|
| 2 | Anna Song |
| 4 | Maria Chi |
Мы успешно вытащили информацию о студентах, у которых дата рождения неизвестна.
Примеры использования функций для обработки NULL
Пример: расчет итоговой суммы с учетом возможных NULL
В таблице заказов хранятся суммы заказов. Однако данные не всегда заполнены, и нам нужно учитывать, что в таких случаях сумма может быть равна 0.
Пример данных:
| order_id | customer_name | order_amount |
|---|---|---|
| 1 | Alex | 1200 |
| 2 | Maria | 2500 |
| 3 | Max | NULL |
| 4 | Xena | 3100 |
Запрос:
SELECT SUM(COALESCE(order_amount, 0)) AS total_amount
FROM orders;
Результат:
| total_amount |
|---|
| 6800 |
Мы используем COALESCE(order_amount, 0), чтобы заменить NULL на 0 перед суммированием. Это позволяет избежать ошибок или некорректных подсчетов.
Пример: вывод текста вместо NULL
| customer_name | order_amount |
|---|---|
| Alex | 1200 |
| Maria | 2500 |
| Max | NULL |
| Xena | 3100 |
В отчете нужно вывести текст "Не указано" для всех пустых данных вместо NULL.
SELECT
customer_name,
COALESCE(order_amount::TEXT, 'Не указано') AS order_status
FROM orders;
Результат:
| customer_name | order_status |
|---|---|
| Alex | 1200 |
| Maria | 2500 |
| Max | Не указано |
| Xena | 3100 |
COALESCE() позволяет отобразить нужный текст, если значение NULL.
Сложные сценарии работы с NULL
| customer_name | order_amount |
|---|---|
| Alex | 1200 |
| Maria | 2500 |
| Max | NULL |
| Xena | 3100 |
Наша задача — отсортировать заказы так, чтобы заказы с отсутствующей суммой оказались в начале, а затем по убыванию от самой большой суммы к самой маленькой.
SELECT customer_name, order_amount
FROM orders
ORDER BY order_amount DESC NULLS FIRST;
Результат:
| customer_name | order_amount |
|---|---|
| Max | NULL |
| Xena | 3100 |
| Maria | 2500 |
| Alex | 1200 |
Здесь мы использовали NULLS FIRST, чтобы разместить NULL значения перед всеми остальными.
Пример: фильтрация данных с заменой NULL значений
| student_id | name | birth_date |
|---|---|---|
| 1 | Otto Art | 2000-01-15 |
| 2 | Anna Song | NULL |
| 3 | Alex Lin | 1999-05-10 |
| 4 | Maria Chi | NULL |
В некоторых отчетах нужно вывести только те строки, где значение заполнено или заменить его на "Неизвестно", если оно NULL.
SELECT
student_id,
name,
COALESCE(birth_date::TEXT, 'Неизвестно') AS birth_date_info
FROM students;
Результат:
| student_id | name | birth_date_info |
|---|---|---|
| 1 | Otto Art | 2000-01-15 |
| 2 | Anna Song | Неизвестно |
| 3 | Alex Lin | 1999-05-10 |
| 4 | Maria Chi | Неизвестно |
Это особенно полезно при составлении отчетов, где важно показать, что данные отсутствуют.
Практические рекомендации
Работа с NULL требует повышенной внимательности. Вот несколько полезных советов:
- Используйте
IS NULLиCOALESCE()для проверки и замены отсутствующих значений. - Помните, что агрегатные функции игнорируют
NULL, за исключениемCOUNT(*). - Для сортировки помните про ключевые слова
NULLS FIRSTиNULLS LAST. - В отчетах всегда указывайте, как вы обрабатываете
NULL, чтобы избежать недоразумений с коллегами.
Такие знания помогут вам не только написать правильные запросы, но и произвести впечатление на собеседовании. Ведь умение работать с реальными данными всегда ценится выше, чем просто теория!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ