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

Bỏ kết hợp nhiều mảng song song

Bạn sẽ yêu tính năng mới này của Postgres 9.4 :

unnest(anyarray, anyarray [, ...])

unnest() với khả năng được mong đợi nhiều (ít nhất là với tôi) để giải nén nhiều mảng song song sạch . Hướng dẫn sử dụng:

mở rộng nhiều mảng (có thể thuộc nhiều loại khác nhau) thành một tập hợp các hàng. Điều này chỉ được phép trong mệnh đề FROM;

Đây là cách triển khai đặc biệt của ROWS FROM mới tính năng.

Chức năng của bạn bây giờ chỉ có thể là:

CREATE OR REPLACE FUNCTION multi_unnest(_some_id int
                                      , _amounts numeric[]
                                      , _invoices text[])
  RETURNS TABLE (some_id int, amount numeric, invoice text) AS
$func$
SELECT _some_id, u.* FROM unnest(_amounts, _invoices) u;
$func$ LANGUAGE sql;

Gọi:

SELECT * FROM multi_unnest(123, '{100, 40.5, 76}'::numeric[] 
                        , '{01-2222-05,01-3333-04,01-4444-08}'::text[]);

Tất nhiên, biểu mẫu đơn giản có thể được thay thế bằng SQL đơn giản (không có chức năng bổ sung):

SELECT 123 AS some_id, *
FROM unnest('{100, 40.5, 76}'::numeric[]
          , '{01-2222-05,01-3333-04,01-4444-08}'::text[]) AS u(amount, invoice);

Trong các phiên bản trước đó (Postgres 9.3- ), bạn có thể sử dụng biểu mẫu kém thanh lịch hơn và kém an toàn hơn:

SELECT 123 AS some_id
     , unnest('{100, 40.5, 76}'::numeric[]) AS amount
     , unnest('{01-2222-05,01-3333-04,01-4444-08}'::text[]) AS invoice;

Lưu ý về dạng viết tắt cũ:ngoài việc không chuẩn để có chức năng set-return trong SELECT danh sách, số hàng được trả về sẽ là bội số chung thấp nhất của mỗi mảng số phần tử (với kết quả đáng ngạc nhiên cho các số không bằng nhau). Chi tiết trong các câu trả lời liên quan sau:

  • Song song unnest () và thứ tự sắp xếp trong PostgreSQL
  • Có cái gì đó giống như một hàm zip () trong PostgreSQL kết hợp hai mảng không?

Hành vi này cuối cùng đã được làm sạch bằng Postgres 10 . Nhiều hàm trả về tập hợp trong SELECT danh sách sản xuất các hàng trong "khóa bước" ngay bây giờ. Xem:

  • Hành vi mong đợi cho nhiều hàm trả về trong mệnh đề SELECT là gì?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. nhầm lẫn cổng postgresql 5433 hay 5432?

  2. 8 tính năng tương thích mới của Oracle trong EnterpriseDB PPAS 9.2 Beta

  3. Lỗi Ruby / PgSQL khi khởi động Rails:không thể tải tệp như vậy - pg_ext (LoadError)

  4. Hàm Postgres trả về bảng không trả về dữ liệu trong cột

  5. Thay đổi kiểu dữ liệu của một cột thành nối tiếp