Problém je v tom, že '' as name
ve skutečnosti neurčuje typ hodnoty. Je to unknown
type a PostgreSQL obvykle odvozuje skutečný typ z věcí, jako je to, do kterého sloupce jej vkládáte nebo do jaké funkce jej předáváte.
V tomto případě jej předáte array_agg
, což je polymorfc funkce. Může přijímat vstupy pseudotypu anyelement
, což ve skutečnosti znamená pouze „přijděte na to za běhu“.
PostgreSQL by na to stále přišel kromě toho array_to_string
ve skutečnosti nebere text[]
jako vstup. Vyžaduje to anyarray
- jiný polymorfní typ, jako anyelement
pro pole.
V dotazu tedy není nic, co by PostgreSQL sdělovalo, jaký typ ''
je. Mohlo by to hádat, že máte na mysli text
, ale na to je to trochu moc náročné. Takže si stěžuje. Problém se zjednodušuje na:
regress=> SELECT array_to_string(array_agg(''), ',');
ERROR: could not determine polymorphic type because input has type "unknown"
Chcete-li to vyřešit, napište napsaný literál:
TEXT '' AS name
nebo použijte obsazení:
CAST('' AS text) AS name
nebo zkratka PostgreSQL:
''::text
příklady:
regress=> SELECT array_to_string(array_agg(TEXT ''), ',');
array_to_string
-----------------
(1 row)
regress=> SELECT array_to_string(array_agg(''::text), ',');
array_to_string
-----------------
(1 row)
regress=> SELECT array_to_string(array_agg(CAST('' AS text)), ',');
array_to_string
-----------------
(1 row)