Problem polega na tym, że '' as name
w rzeczywistości nie określa typu wartości. To unknown
type, a PostgreSQL zwykle wywnioskuje rzeczywisty typ z takich rzeczy, jak kolumna, do której go wstawiasz lub funkcja, do której go przekazujesz.
W takim przypadku przekazujesz go do array_agg
, który jest polimorfem funkcjonować. Może pobierać dane wejściowe pseudotypu anyelement
, co tak naprawdę oznacza „rozwiąż to w czasie wykonywania”.
PostgreSQL nadal to rozgryzie, z wyjątkiem tego, że array_to_string
w rzeczywistości nie przyjmuje text[]
jako wejście. Zajmuje anyarray
- inny typ polimorficzny, jak anyelement
dla tablic.
Więc w zapytaniu nie ma nic, co mogłoby powiedzieć PostgreSQL, jakiego typu jest ten ''
jest. Może zgadnąć, że chodziło Ci o text
, ale to trochę zbyt wybredne. Więc narzeka. Problem upraszcza się do:
regress=> SELECT array_to_string(array_agg(''), ',');
ERROR: could not determine polymorphic type because input has type "unknown"
Aby rozwiązać ten problem, napisz wpisany literał:
TEXT '' AS name
lub użyj rzutu:
CAST('' AS text) AS name
lub skrót PostgreSQL:
''::text
przykłady:
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)