NULL в SQL: агрегаты и выражения в отчётах рядом с Битрикс
Почему это важно на практике
В универсальных таблицах свойств инфоблоков и в кастомных сущностях часто встречаются «дыры»: необязательные суммы, даты действия скидок, внешние коды для обмена. В SQL NULL — это не ноль и не пустая строка; от этого ломаются наивные суммы и усреднения в отчётах админки.
Арифметика и конкатенация
Выражение 1 + NULL даёт NULL: любая операция с неизвестным операндом остаётся неизвестной. Для строк CONCAT('a', NULL) в MySQL тоже возвращает NULL, потому что конкатенация «протягивает» пропуск. Если нужен текст без обрыва цепочки, используйте CONCAT_WS — он игнорирует NULL-аргументы между разделителями.
Демонстрация на одном запросе
SELECT
1 + NULL AS sum_with_null,
CONCAT(1, NULL) AS concat_simple,
CONCAT_WS(',', 1, NULL) AS concat_ws_skip,
AVG(v) AS avg_mixed,
COUNT(*) AS cnt_rows,
MIN(v) AS min_mixed
FROM (
SELECT 1 AS v
UNION ALL
SELECT NULL AS v
) AS t;
Ожидаемое поведение: AVG учитывает только ненулевые числа (в примере среднее по одному значению 1), COUNT(*) считает строки целиком (две строки), MIN по смешанному набору даёт минимум среди известных значений. Если бы вы делали SUM(v) без COALESCE, одна «дыра» не испортила бы сумму так же радикально, как умножение на NULL — но среднее и проценты всё равно нужно интерпретировать осознанно.
Связка с выборками в Битрикс
В ORM и сырых SQL кастомных модулей проверяйте фильтры: условие WHERE optional_flag = NULL никогда не сработает — нужен IS NULL. Для витрин и дашбордов заранее договоритесь, чем заменять пропуски: COALESCE(amount, 0), отдельная колонка «не задано» или исключение строки из KPI.
Итог
Один раз прогоните учебный запрос на копии базы и зафиксируйте ожидаемые столбцы — это дешевле, чем объяснять бизнесу «почему средний чек пропал» после миграции данных.
Не хотите копаться сами?
Починю за 1-3 дня. Без предоплаты — оплата по результату.
15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии