2014-06-17 14 views
7

Tôi có một câu hỏi mang đến cho đầu ra nhưKhông thể xác định loại đa hình vì đầu vào có kiểu "không rõ"

Không thể xác định loại đa hình vì đầu vào có kiểu "không rõ"

Query:

select (array_to_string(array_agg(name), ', '))::text as name,path 
from(select 'fullpath' as Path,null as id,'' as name 
    from tblabc where key = 'key1' and value = '1' 
    ) as e 
group by path; 

tôi có một postgres cơ sở dữ liệu

+1

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ó. –

Trả lời

14

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) 
+0

Theo bạn nói, tôi thực hiện điều này nhưng tôi đã "không tìm thấy chức năng chuyển đổi từ không biết đến văn bản" –

+1

@samkitshah Làm việc cho tôi. Hiển thị truy vấn trong bản cập nhật cho câu hỏi của bạn. Cũng hiển thị 'SELECT version()'; –

+0

Phiên bản là: PostgreSQL 8.4.5 .. đã thử tất cả truy vấn cập nhật vẫn không có kết quả .. –

Các vấn đề liên quan