Vấn đề ở đây là '' as name
không thực sự chỉ định loại cho giá trị. Đó là loại unknown
và PostgreSQL thường xâm nhập vào loại thực từ những thứ như cột bạn đang chèn vào hoặc chức năng nào bạn truyền vào.
Trong trường hợp này, bạn chuyển nó tới array_agg
, đây là hàm đa hình. Nó có thể lấy đầu vào của kiểu giả anyelement
, điều này thực sự chỉ có nghĩa là "tìm ra nó khi chạy".
PostgreSQL sẽ vẫn tính toán nó trừ khi array_to_string
không thực sự lấy text[]
làm đầu vào. Phải mất anyarray
- một loại đa hình khác, chẳng hạn như anyelement
cho mảng.
Vì vậy, không có gì trong truy vấn để cho PostgreSQL biết loại nào ''
là. Nó có thể đoán bạn có nghĩa là text
, nhưng đó là một chút quá cầu kỳ cho điều đó. Vì vậy, nó phàn nàn. Vấn đề đơn giản hoá xuống:
regress=> SELECT array_to_string(array_agg(''), ',');
ERROR: could not determine polymorphic type because input has type "unknown"
Để giải quyết việc này, hãy viết một gõ chữ:
TEXT '' AS name
hoặc sử dụng một dàn diễn viên:
CAST('' AS text) AS name
hoặc viết tắt PostgreSQL:
''::text
ví dụ:
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)
Nguồn
2014-06-17 08:50:13
Truyền NULL đến một số kiểu dữ liệu hoặc thả nó bởi vì bạn không sử dụng nó. –