Ошибка PostgreSQL 42804 datatype_mismatch: несоответствие типов данных
СУБД отклоняет запрос, когда тип возвращаемого выражения не совпадает с ожидаемым контекстом или типами других веток оператора:
ERROR: structure of query does not match function result type
-- либо:
ERROR: UNION types text and integer cannot be matched
LINE 2: SELECT 1 UNION ALL SELECT 'text';
SQLSTATE: 42804В платформе 1С ошибка возникает при объединении несовместимых типов в запросах ОБЪЕДИНИТЬ ВСЕ или несовпадении типов веток ВЫБОР КОГДА ... ТОГДА.
1. Исправление конфликтов типов в UNION / UNION ALL
Все объединяемые запросы должны иметь идентичные типы данных в соответствующих позициях колонок:
-- ОШИБКА 42804:
SELECT id, total_amount FROM orders
UNION ALL
SELECT id, 'Нет данных' FROM archived_orders;
-- ИСПРАВЛЕНИЕ с приведением к общему типу (например, text):
SELECT id::text, total_amount::text FROM orders
UNION ALL
SELECT id::text, 'Нет данных' FROM archived_orders;2. Согласование типов в операторах CASE WHEN / COALESCE
Все ветки THEN и ELSE обязаны возвращать один и тот же тип данных:
-- ОШИБКА:
SELECT CASE WHEN is_active THEN 1 ELSE 'Не активен' END FROM users;
-- ИСПРАВЛЕНИЕ:
SELECT CASE WHEN is_active THEN '1' ELSE 'Не активен' END FROM users;3. Исправление запросов 1С:Предприятие
В текстах запросов 1С используйте явное приведение типов через функцию ВЫРАЗИТЬ():
// Запрос 1С с согласованием типов колонок
ВЫБРАТЬ
Заказ.Номер КАК ДокументНомер,
Заказ.Сумма КАК СуммаДокумента
ИЗ
Документ.ЗаказКлиента КАК Заказ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Списание.Номер,
ВЫРАЗИТЬ(0 КАК ЧИСЛО(15, 2)) // Явное задание типа Число вместо пустой ссылки
ИЗ
Документ.СписаниеБезналичныхДенежныхСредств КАК Списание Частые вопросы (FAQ)
Почему PostgreSQL не приводит int к text автоматически в UNION?
В целях предотвращения скрытых ошибок оптимизации и потери производительности PostgreSQL запрещает неявное приведение фундаментально различных категорий типов (числа, строки, бинарные данные, даты) без явного оператора CAST (::).
Как функция COALESCE обрабатывает разные типы аргументов?
Функция COALESCE пытается привести все переданные аргументы к типу первого аргумента. Если неявное приведение невозможно, ядро возвращает ошибку 42804.
Почему 42804 возникает при создании триггерной функции?
Триггерная функция обязана возвращать тип trigger (или event_trigger для DDL событий). Если функция объявлена как возвращающая void, integer или text, CREATE TRIGGER завершится ошибкой 42804.
Как узнать категорию типа данных в PostgreSQL?
Выполните запрос к системному каталогу pg_type: SELECT typname, typcategory FROM pg_type WHERE typname = 'my_type'; (например, 'S' - String, 'N' - Numeric, 'D' - DateTime).