Ошибка PostgreSQL 22012 division_by_zero: деление на ноль в запросах
СУБД возвращает ошибку при попытке выполнения арифметической операции деления на ноль:
ERROR: division by zero
SQLSTATE: 22012В 1С сбой прерывает формирование отчетов на базе СКД, выполнение регламентных заданий расчета себестоимости и закрытия счетов, где в знаменателе оказывается нулевое количество товара или нулевая база распределения.
1. Безопасное деление в SQL через NULLIF
Функция NULLIF(val1, val2) возвращает NULL, если val1 = val2. В PostgreSQL деление на NULL дает NULL без генерации исключения:
-- Запрос, вызывающий ошибку:
SELECT total_sum / quantity FROM sales;
-- Безопасный запрос с возвратом NULL при quantity = 0:
SELECT total_sum / NULLIF(quantity, 0) FROM sales;
-- Безопасный запрос с подстановкой дефолтного значения 0 через COALESCE:
SELECT COALESCE(total_sum / NULLIF(quantity, 0), 0) FROM sales;2. Использование конструкции CASE WHEN
SELECT
id,
CASE
WHEN quantity IS NULL OR quantity = 0 THEN 0
ELSE total_sum / quantity
END AS unit_price
FROM sales;3. Исправление в отчетах и коде 1С:Предприятие
Во встроенном языке 1С используйте тернарный оператор или функцию ВЫБОР в текстах запросов:
// Запрос 1С
ВЫБРАТЬ
Продажи.Номенклатура,
ВЫБОР
КОГДА Продажи.Количество = 0 ТОГДА 0
ИНАЧЕ Продажи.Сумма / Продажи.Количество
КОНЕЦ КАК СредняяЦена
ИЗ
РегистрНакопления.Продажи КАК Продажи4. Обработка в схемах компоновки данных (СКД)
В выражениях полей ресурсов СКД применяйте выражение:
Выбор Когда Количество = 0 Тогда 0 Иначе Сумма / Количество Конец Частые вопросы (FAQ)
Почему PostgreSQL не возвращает Infinity при делении на ноль?
В соответствии со стандартом ANSI SQL деление целых чисел и чисел с фиксированной точкой (numeric) на ноль обязано вызывать исключение SQLSTATE 22012. Значения 'Infinity' и '-Infinity' допустимы только для чисел с плавающей запятой типов float4 / float8 (IEEE 754 standard).
Как глобально заставить PostgreSQL игнорировать division by zero?
В PostgreSQL нет серверной настройки для отключения проверки деления на ноль. Все подобные операции обязаны обрабатываться на уровне кода запроса с помощью NULLIF или CASE.
Что эффективнее по производительности: NULLIF или CASE WHEN?
Конструкция NULLIF(a, 0) транслируется планировщиком в оптимизированное выражение сравнения и выполняется быстрее, чем полная ветка CASE WHEN, при этом делая SQL-код более лаконичным.
Как деление на ноль влияет на общую транзакцию в PostgreSQL?
Любое необработанное деление на ноль переводит текущую транзакцию в статус ERROR. Все последующие запросы внутри этой транзакции будут отклоняться с кодом 25P02 (current transaction is aborted) до выполнения ROLLBACK.