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)