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ì?