Het probleem hier is dat '' as name
specificeert niet echt een type voor de waarde. Het is de unknown
type, en PostgreSQL leidt het echte type meestal af uit zaken als in welke kolom je het invoegt of aan welke functie je het doorgeeft.
In dit geval geef je het door aan array_agg
, wat een polymorfe . is functie. Het kan invoer van het pseudo-type anyelement
, wat eigenlijk gewoon betekent "het uitvinden tijdens runtime".
PostgreSQL zou het nog steeds uitzoeken, behalve dat array_to_string
neemt niet echt een text[]
als invoer. Het duurt anyarray
- een ander polymorf type, zoals anyelement
voor arrays.
Dus er is niets in de query om PostgreSQL te vertellen welk type dat ''
is. Het zou kunnen raden dat je text
bedoelde , maar daar is het een beetje te kieskeurig voor. Het klaagt dus. Het probleem wordt vereenvoudigd tot:
regress=> SELECT array_to_string(array_agg(''), ',');
ERROR: could not determine polymorphic type because input has type "unknown"
Om dit op te lossen, schrijf een getypte letterlijke:
TEXT '' AS name
of gebruik een cast:
CAST('' AS text) AS name
of de PostgreSQL-afkorting:
''::text
voorbeelden:
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)