2011-09-09 9 views
9

Tôi có một loại hỗn hợp nhưLàm thế nào để xây dựng một mảng chữ của một loại hỗn hợp có chứa mảng?

CREATE TYPE example AS (id integer, some_stuff integer[]); 

Nghĩ rằng tôi có thể sử dụng một loạt các loại này như là một đối số của một hàm. Vấn đề duy nhất là tôi không thể tìm thấy một cách để xây dựng một mảng đen cho rằng ... Nếu tôi cố gắng có được nó từ PostgreSQL:

WITH elements AS (
    SELECT (12, '{1,2}')::example AS e UNION 
    SELECT (3, '{3,1}')::example 
) 
SELECT array_agg(e) FROM elements; 

tôi nhận được như sau:

{"(3,\"{3,1}\")","(12,\"{1,2}\")"} 

Nhưng nhìn :

SELECT E'{"(3,\"{3,1}\")","(12,\"{1,2}\")"}'::example[]; 

ERROR: malformed array literal: "{"(3,"{3,1}")","(12,"{1,2}")"}" 
LINE 1: select E'{"(3,\"{3,1}\")","(12,\"{1,2}\")"}'::example[] 

Có cách nào để thực hiện việc này không?

Trả lời

11

Hãy thử sử dụng ARRAYROW constructors:

Select array[row(3, array[3,1]), row(12, array[1,2])]::example[]; 
       array 
------------------------------------ 
{"(3,\"{3,1}\")","(12,\"{1,2}\")"} 
(1 row) 

Nếu bạn muốn giải pháp mà không sử dụng nhà thầu, sau đó sử dụng ví dụ sau:

Select E'{"(3,\\"{3,1}\\")","(12,\\"{1,2}\\")"}'::example[]; 
       example 
------------------------------------ 
{"(3,\"{3,1}\")","(12,\"{1,2}\")"} 
(1 row) 

Như bạn thấy vấn đề chính ở đây là bạn cần phải viết \\", bởi vì điều này có nghĩa là \" (sử dụng cú pháp chuỗi "thoát") mà bạn đã xem là đầu ra của lựa chọn đầu tiên của mình.

+0

Cảm ơn! Vấn đề duy nhất là tôi phải sử dụng literals ở đây, constructor mảng không phải là một lựa chọn. May mắn thay đây là một trường hợp hiếm hoi :) – dezso

+0

@dezso: Tôi thấy, kiểm tra câu trả lời đã chỉnh sửa của tôi. –

+0

Tuyệt vời! cảm ơn rất nhiều. – dezso