Le problème ici est que '' as name
ne spécifie pas réellement un type pour la valeur. C'est l'unknown
type, et PostgreSQL déduit généralement le type réel à partir de choses comme la colonne dans laquelle vous l'insérez ou la fonction à laquelle vous le transmettez.
Dans ce cas, vous le transmettez à array_agg
, qui est un polymorphe fonction. Il peut prendre des entrées du pseudo-type anyelement
, ce qui signifie en fait "comprendre au moment de l'exécution".
PostgreSQL le comprendrait toujours sauf que array_to_string
ne prend pas réellement un text[]
comme entrée. Il faut anyarray
- un autre type polymorphe, comme anyelement
pour les tableaux.
Il n'y a donc rien dans la requête pour dire à PostgreSQL quel type ce ''
est. Il pourrait deviner que vous vouliez dire text
, mais c'est un peu trop pointilleux pour ça. Alors ça se plaint. Le problème se résume à :
regress=> SELECT array_to_string(array_agg(''), ',');
ERROR: could not determine polymorphic type because input has type "unknown"
Pour résoudre ce problème, écrivez un littéral typé :
TEXT '' AS name
ou utilisez un plâtre :
CAST('' AS text) AS name
ou le raccourci PostgreSQL :
''::text
exemples :
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)