Ошибка 42804 в PostgreSQL (datatype_mismatch) означает несовпадение типов данных. Сервер ожидает конкретный тип и не может привести значение автоматически. Это ошибка класса 42, но, в отличие от 42883, она возникает не при подборе функции, а при присваивании, сравнении или возврате значения.
Частые причины
- Тип столбца в INSERT или UPDATE не совпадает с типом значения и неявное приведение недоступно.
- Функция объявлена с RETURNS одного типа, а фактически возвращает другой.
- Ветви CASE или элементы UNION возвращают разные, несовместимые типы.
- В условии WHERE сравниваются несопоставимые типы (например, boolean и integer).
- Тип управляющего значения не соответствует объявлению (WHEN в CASE, аргумент условия).
Как исправить ошибку 42804
- Определите проблемное место по тексту ошибки – PostgreSQL называет ожидаемый и полученный тип (column is of type integer but expression is of type text).
- Приведите значение к нужному типу явным преобразованием:
UPDATE orders SET amount = total_text::numeric WHERE id = 1;
- Согласуйте типы в ветвях выражения – все ветви CASE и все части UNION должны возвращать один тип:
SELECT id::text FROM a UNION ALL SELECT code::text FROM b;
- При несовпадении типа возврата функции исправьте объявление RETURNS или приведите итоговое значение внутри функции.