Postgres 9.5 trở lên
có array_agg(array expression)
:
array_agg
(anyarray
) →anyarray
Nối tất cả các mảng đầu vào thành một mảng có một thứ nguyên cao hơn. (Tất cả các đầu vào phải có cùng kích thước và không được để trống hoặc rỗng.)
Đây là phần thay thế cho hàm tổng hợp tùy chỉnh của tôi array_agg_mult()
minh họa bên dưới. Nó được triển khai bằng C và nhanh hơn đáng kể. Sử dụng nó.
Postgres 9.4
Sử dụng ROWS FROM
cấu trúc hoặc unnest()
được cập nhật trong đó có nhiều mảng để hủy đặt song song. Mỗi lon có chiều dài khác nhau. Bạn nhận được (theo tài liệu):
[...] số hàng kết quả trong trường hợp này là của kết quả hàm lớn nhất, với các kết quả nhỏ hơn được đệm bằng giá trị null để khớp.
Sử dụng biến thể gọn gàng và đơn giản hơn này:
SELECT ARRAY[a,b] AS ab
FROM unnest('{a,b,c}'::text[]
, '{d,e,f}'::text[]) x(a,b);
Postgres 9.3 trở lên
Mã zip đơn giản ()
Hãy xem xét bản trình diễn sau cho Postgres 9.3 hoặc phiên bản cũ hơn :
SELECT ARRAY[a,b] AS ab
FROM (
SELECT unnest('{a,b,c}'::text[]) AS a
, unnest('{d,e,f}'::text[]) AS b
) x;
Kết quả:
ab
-------
{a,d}
{b,e}
{c,f}
Lưu ý rằng cả hai mảng phải có cùng số phần tử để hủy kết hợp song song hoặc thay vào đó bạn nhận được kết hợp chéo.
Bạn có thể gói nó thành một hàm, nếu bạn muốn:
CREATE OR REPLACE FUNCTION zip(anyarray, anyarray)
RETURNS SETOF anyarray LANGUAGE SQL AS
$func$
SELECT ARRAY[a,b] FROM (SELECT unnest($1) AS a, unnest($2) AS b) x;
$func$;
Gọi:
SELECT zip('{a,b,c}'::text[],'{d,e,f}'::text[]);
Kết quả tương tự.
zip () thành mảng nhiều chiều:
Bây giờ, nếu bạn muốn tổng hợp tập hợp các mảng mới đó thành một 2 chiều mảng, nó trở nên phức tạp hơn.
SELECT ARRAY (SELECT ...)
hoặc:
SELECT array_agg(ARRAY[a,b]) AS ab
FROM (
SELECT unnest('{a,b,c}'::text[]) AS a
,unnest('{d,e,f}'::text[]) AS b
) x
hoặc:
SELECT array_agg(ARRAY[ARRAY[a,b]]) AS ab
FROM ...
tất cả sẽ dẫn đến cùng một thông báo lỗi (được kiểm tra với trang 9.1.5):
LỖI:không thể tìm thấy kiểu mảng cho kiểu dữ liệu văn bản []
Nhưng có một cách để giải quyết vấn đề này, vì chúng tôi đã giải quyết câu hỏi có liên quan chặt chẽ này.
Tạo một hàm tổng hợp tùy chỉnh:
CREATE AGGREGATE array_agg_mult (anyarray) (
SFUNC = array_cat
, STYPE = anyarray
, INITCOND = '{}'
);
Và sử dụng nó như thế này:
SELECT array_agg_mult(ARRAY[ARRAY[a,b]]) AS ab
FROM (
SELECT unnest('{a,b,c}'::text[]) AS a
, unnest('{d,e,f}'::text[]) AS b
) x
Kết quả:
{{a,d},{b,e},{c,f}}
Lưu ý ARRAY[]
bổ sung lớp! Không có nó và chỉ:
SELECT array_agg_mult(ARRAY[a,b]) AS ab
FROM ...
Bạn nhận được:
{a,d,b,e,c,f}
Điều này có thể hữu ích cho các mục đích khác.
Cuộn một chức năng khác:
CREATE OR REPLACE FUNCTION zip2(anyarray, anyarray)
RETURNS SETOF anyarray LANGUAGE SQL AS
$func$
SELECT array_agg_mult(ARRAY[ARRAY[a,b]])
FROM (SELECT unnest($1) AS a, unnest($2) AS b) x;
$func$;
Gọi:
SELECT zip2('{a,b,c}'::text[],'{d,e,f}'::text[]); -- or any other array type
Kết quả:
{{a,d},{b,e},{c,f}}