Замена NULL на 0 в SQL: функция SUM и отсутствие данных
Быстрый ответ
Для элегантного преобразования NULL, полученного от SQL-функции, в 0 воспользуйтесь функцией COALESCE:
SELECT COALESCE(yourFunction(...), 0);
Теперь если результат функции будет NULL, на его место подставится надежное значение 0.

Понимание NULL и агрегатных функций в SQL
Корректное применение SQL-функций критически важно для обеспечения точности данных. Агрегатные функции вида SUM() возвращают NULL в случае отсутствия соответствующих записей. Для обеспечения более предсказуемых результатов распространено заменять NULL на 0 с помощью функции COALESCE:
SELECT COALESCE(SUM(column), 0) ... -- Если SUM ничего не нашла, COALESCE выручит, подставив ноль.
Как альтернативу можно использовать функцию ISNULL:
SELECT ISNULL(SUM(column), 0) ... -- Если в результатах SUM обнаружен NULL, функция ISNULL заменит его на ноль.
ISNULL проверяет первый аргумент на NULL, и если он является таковым, заменяет его вторым аргументом. Однако поддержка ISNULL ограничена двумя параметрами. Если целью является простое замещение NULL в SQL Server, ISNULL будет эффективной, но COALESCE предпочтительнее за свою универсальность.
Переводите возможные NULL в подзапросах в нули для учета, подобного тому, как это делается в CRM-системах:
SELECT COALESCE((SELECT SUM(column) FROM table), 0); -- "Не найдено данных? Получите ноль!"
Преобразование NULL не только в нули и не только для агрегатных функций
Предложение альтернативных значений
Если ожидается не ноль, а другое значение? Функция COALESCE без проблем с этим справится! Она позволяет вам определить цепочку возможных альтернатив:
SELECT COALESCE(column1, column2, 'alternative') FROM table;
Оценка производительности
Важно учитывать, что функции COALESCE и ISNULL могут вести себя по-разному в зависимости от системы управления базой данных и конкретных условий. Рекомендуется проводить тестирование запросов, чтобы выбрать наиболее производительное решение.
Обработка сложных сценариев
Функции COALESCE и ISNULL успешно справляются не только с заменой значений одного столбца, они также эффективны в более сложных сценариях:
SELECT COALESCE(AVG(NULLIF(column, 0)), 0) ... -- "Нужно среднее значение без учета нулей? Получите ноль при NULL!"
Визуализация
Представьте оценивание прыжков в воду на соревнованиях и вы играете в этом процессе роль судьи:
Прыжок 1: 7.5 | Прыжок 2: NULL | Прыжок 3: 8.0
Пропущенный балл вполне можно сравнить с невыполненным прыжком:
До: [⭐, ❓, ⭐]
Используя COALESCE или ISNULL мы заменяем пропущенный балл на 0, таким образом у всех спортсменов появляется результат:
SELECT COALESCE(score_diver, 0);
Мы получаем следующее представление оценок:
После: [⭐, 0️⃣, ⭐]
Соревнование продолжается без перебоев!
Лучшие практики и профессиональные советы
Функция COUNT() и NULL
Функция COUNT() всегда возвращает минимум 0, т.к. подсчитывает строки, а не уникальные значения. Не есть необходимостью оборачивать COUNT() в COALESCE или ISNULL:
SELECT COALESCE(COUNT(column), 0) ... -- Будет ли NULL для пустой таблицы? Нет, функция COUNT всегда возвращает результат, хотя бы ноль.
Обеспечение согласованности типов данных
Важно совпадение типов данных запасного значения с ожидаемым типом данных столбца, чтобы избежать нежелательных эффектов.
Каскадирование COALESCE для обработки нескольких NULL
Если стоит задача обработки нескольких потенциальных NULL, COALESCE идеально подойдет для решения этой проблемы:
SELECT COALESCE(column1, column2, default_value) ... -- "NULLы передают эстафету, а на конец — замена на ноль!"
Учитывайте разницу в поведении фукнций в разных базах данных
Имейте в виду, что поведение функций COALESCE и ISNULL может заметно отличаться в различных базах данных. Обязательно изучите документацию по вашей системе управления базами данных.
Полезные материалы
- COALESCE (Transact-SQL) – SQL Server | Microsoft Learn – подробное описание использвания COALESCE для обработки NULL в SQL Server.
- Функция SQL Server ISNULL() — отличное пошаговое руководство по функции ISNULL для замены NULL на указанное значение.
- SQL – Using ISNULL instead of COALESCE for checking a specific condition? – Stack Overflow — обсуждение на Stack Overflow о сравнении ISNULL и COALESCE.
- NVL (Oracle Documentation) — описание функции NVL в Oracle, выполняющей аналогичное использование COALESCE или ISNULL.
- ZeroIFNull usage in Teradata — страничка с рекомендациями по использованию ZeroIFNull в Teradata для обработки значений NULL (ссылка в задаче некорректна, заменена на более подходящую по смыслу).