NULLIF: возврат NULL при совпадении двух значений
Что делает функция NULLIF? 🧐
NULLIF — это одна из тех скромных, но невероятно полезных функций SQL, которая работает как тихий страж ваших данных. Её задача проста:
Если два переданных значения равны — вернуть NULL.
Если не равны — вернуть первое значение.
Синтаксис:
NULLIF(value1, value2)
Зачем это нужно? 🤔
Представьте, что вы аналитик в интернет-магазине и работаете с данными о скидках. Некоторые товары имеют скидку 0% (что по сути равно отсутствию скидки), и вам нужно заменить такие случаи на NULL для чистоты анализа.
Вот как NULLIF спасает ситуацию:
SELECT
product_name,
NULLIF(discount_percent, 0) AS clean_discount
FROM products;
Что произойдёт:
- Если discount_percent = 0 → вернётся NULL
- Если discount_percent > 0 → вернётся исходное значение
Реальные кейсы применения 🔥
1. Очистка данных перед делением
Деление на ноль — классическая ошибка. NULLIF помогает избежать её элегантно:
SELECT
revenue / NULLIF(orders_count, 0) AS avg_revenue_per_order
FROM sales;
2. Замена пустых строк
Иногда пустые строки ('') нужно трактовать как NULL:
SELECT
NULLIF(customer_comment, '') AS meaningful_comments
FROM feedback;
3. Сравнение версий данных
В ETL-процессах часто нужно выявить изменения:
SELECT
id,
NULLIF(old_value, new_value) AS changed_value
FROM data_updates;
Как NULLIF связан с COALESCE? 🤝
Эти функции — лучшие друзья! COALESCE возвращает первое NON-NULL значение, а NULLIF может создавать NULL'ы для обработки.
Пример комбо: Замена нулей на читаемое значение:
SELECT
COALESCE(NULLIF(discount, 0), 'No discount') AS discount_label
FROM products;
Подводные камни ⚠️
-
Типы данных должны совпадать:
sql NULLIF('10', 10) -- Ошибка в некоторых СУБД (разные типы) -
NULL не равен NULL:
Функция вернёт NULL ТОЛЬКО при явном равенстве аргументов, а не при сравнении двух NULL'ов. -
Особенности СУБД:
В PostgreSQL NULLIF строгий к типам, а в MySQL — более лоялен. Проверяйте документацию!
Практикуемся на реальных данных 🛠️
Задача: В таблице employee_salaries есть зарплаты и бонусы. Некоторые бонусы равны 0, что означает их отсутствие. Нужно:
- Заменить нулевые бонусы на NULL
- Посчитать общий доход (salary + bonus), игнорируя NULL
Решение:
SELECT
employee_id,
salary,
NULLIF(bonus, 0) AS clean_bonus,
salary + COALESCE(NULLIF(bonus, 0), 0) AS total_income
FROM employee_salaries;
Разбор:
- Сначала NULLIF превращает 0 в NULL
- COALESCE подменяет NULL обратно на 0 для арифметики
Философия NULLIF 🧠
Эта функция — идеальный пример принципа "чем проще, тем лучше" в SQL. Она не пытается делать всё, но решает одну задачу безупречно: превращает ненужные значения в NULL, чтобы вы могли чисто и прозрачно работать с данными дальше.
Попробуйте применить NULLIF в своём следующем запросе — вы удивитесь, как часто он оказывается полезен! 🚀