Masalahnya di sini adalah '' as name tidak benar-benar menentukan tipe untuk nilainya. Ini adalah unknown ketik, dan PostgreSQL biasanya menyimpulkan tipe sebenarnya dari hal-hal seperti kolom tempat Anda memasukkannya atau fungsi apa yang Anda berikan.
Dalam hal ini, Anda meneruskannya ke array_agg , yang merupakan polimorfik fungsi. Itu dapat mengambil input dari anyelement tipe-semu , yang sebenarnya hanya berarti "cari tahu saat runtime".
PostgreSQL masih akan mengetahuinya kecuali array_to_string sebenarnya tidak mengambil text[] sebagai masukan. Dibutuhkan anyarray - tipe polimorfik lain, seperti anyelement untuk array.
Jadi tidak ada dalam kueri yang memberi tahu PostgreSQL jenis apa '' adalah. Itu bisa menebak maksud Anda text , tapi agak terlalu rewel untuk itu. Jadi mengeluh. Masalah ini disederhanakan menjadi:
regress=> SELECT array_to_string(array_agg(''), ',');
ERROR: could not determine polymorphic type because input has type "unknown"
Untuk mengatasi ini, tulis literal yang diketik:
TEXT '' AS name
atau gunakan pemeran:
CAST('' AS text) AS name
atau singkatan PostgreSQL:
''::text
contoh:
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)