PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Có cái gì đó giống như một hàm zip () trong PostgreSQL kết hợp hai mảng không?

Postgres 9.5 trở lên

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}}


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để chọn mảng 1d từ mảng 2d?

  2. Xác định tên bảng và cột làm đối số trong hàm plpgsql?

  3. Cách ánh xạ trường mảng PostgreSQL trong Django ORM

  4. Postgres sao chép Heroku Production DB sang DB phát triển cục bộ

  5. Mẹo lưu trữ bản sao lưu PostgreSQL trên Google Cloud (GCP)