Il problema qui è che '' as name
in realtà non specifica un tipo per il valore. È il unknown
type e PostgreSQL di solito deduce il tipo reale da cose come la colonna in cui lo stai inserendo o la funzione a cui lo passi.
In questo caso, lo passi a array_agg
, che è un polimorfo funzione. Può accettare input dello pseudo-tipo anyelement
, che in realtà significa solo "capirlo in fase di esecuzione".
PostgreSQL lo capirebbe comunque tranne che array_to_string
in realtà non accetta un text[]
come input. Ci vuole anyarray
- un altro tipo polimorfico, come anyelement
per gli array.
Quindi non c'è nulla nella query che dica a PostgreSQL quale tipo di ''
è. Potrebbe indovinare che intendevi text
, ma è un po' troppo esigente per quello. Quindi si lamenta. Il problema si semplifica fino a:
regress=> SELECT array_to_string(array_agg(''), ',');
ERROR: could not determine polymorphic type because input has type "unknown"
Per risolvere questo problema, scrivi un letterale digitato:
TEXT '' AS name
oppure usa un cast:
CAST('' AS text) AS name
o la scorciatoia PostgreSQL:
''::text
esempi:
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)