ここでの問題は、名前としての'' as nameです。 実際には値のタイプを指定しません。 unknownです タイプ。PostgreSQLは通常、挿入する列や渡す関数などから実際のタイプを推測します。
この場合、それをarray_aggに渡します。 、これは polymorphc 関数。疑似タイプanyelementの入力を受け取ることができます 、これは実際には「実行時にそれを理解する」という意味です。
array_to_stringを除いて、PostgreSQLはそれを理解します。 実際にはtext[]を取りません 入力として。 anyarrayが必要です -anyelementなどの別のポリモーフィックタイプ アレイ用。
したがって、クエリには、その'' as nameのタイプをPostgreSQLに通知するものは何もありません。 は。 textを意味していると推測できます 、しかしそれは少しうるさいです。だからそれは文句を言う。この問題は次のように単純化されます:
regress=> SELECT array_to_string(array_agg(''), ',');
ERROR: could not determine polymorphic type because input has type "unknown"
これを解決するには、型付きリテラルを記述します:
TEXT '' AS name
またはキャストを使用する:
CAST('' AS text) AS name
またはPostgreSQLの省略形:
''::text
例:
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)