Не вдалося знайти функцію перетворення з невідомого в текст


77

В одному з моїх операторів вибору я отримав таку помилку:

ERROR:  failed to find conversion function from unknown to text
********** Error **********
ERROR: failed to find conversion function from unknown to text
SQL state: XX000

Це було легко виправити за допомогою cast, але я не до кінця розумію, чому це сталося. Я проілюструю свою плутанину двома простими твердженнями.

Це нормально:

select 'text'
union all
select 'text';

Це поверне помилку:

with t as (select 'text')    
select * from t
union all
select 'text'

Я знаю, що можу це легко виправити:

with t as (select 'text'::text)    
select * from t
union all
select 'text'

Чому перетворення не вдається у другому прикладі? Чи є якась логіка, яку я не розумію, або це буде виправлено у наступній версії PostgreSQL?

PostgreSQL 9.1.9

Така ж поведінка на PostgreSQL 9.2.4 ( SQL Fiddle )


::textне працював у мене. Це рішення зробило, поставивши 'text' перед текстовим літералом: stackoverflow.com/a/25193282/349169
Кріс,

Використання PostgreSQL 9.6 видає виняток, використання PostgreSQL 10 і вище працює, хоча ... (перевірено на db-fiddle.com )
kaaas,

Відповіді:


72

Postgres радий, якщо він може виявити типи нетипізованих констант з контексту. Але коли будь-який контекст неможливий, і коли запит трохи складніший, ніж тривіальний, тоді цей механізм виходить з ладу. Ці правила специфічні для будь-якого речення SELECT, а деякі - жорсткіші, інші - ні. Якщо я можу сказати, то старі підпрограми є більш толерантними (завдяки вищій сумісності з Oracle та менш негативним впливом на початківців), сучасні менш толерантні (завдяки більшій безпеці при помилках типу).

Було кілька пропозицій спробувати працювати з будь-якою невідомою буквальною константою, такою як текстова константа, але була відхилена з більшої кількості причин. Тож я не очікую значних змін у цій галузі. Ця проблема, як правило, пов’язана із синтетичними тестами - і рідше із реальними запитами, де типи виводяться із типів стовпців.


5
Розумію. З цим питанням я стикаюся досить часто в реальному житті. Ми використовуємо PostgreSQL для аналізу / аналізу даних / bi / data, а об'єднання нетипізованих констант є загальним явищем. Але, як я вже сказав, це легко зробити.
Томаш Грейф,

3
Чому б мені не доводити числові літерали, як 1::int?
Iain Samuel McLean Elder

1
@IainElder - числові типи є меншим класом - будь-яка літеральна константа (з назвою "невідома") може неявно передаватися до будь-якого типу - число не - отже, sin ('2.34') працює, але довжина (1) ні
Павел Стехуле

4
Я постійно повертаюся до цього питання, намагаючись отримати unionрезультати. А в майбутньому мені лінь, тому я не читаю цілого питання, яке насправді включає відповідь: перетворити об’єднані значення в текст.
samthebrand
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.