Ще обичате тази нова функция на Postgres 9.4 :
unnest(anyarray, anyarray [, ...])
unnest()
с дългоочакваната (поне от мен) способност за паралелно изключване на множество масиви чисто . Ръководството:
разширяване на множество масиви (евентуално от различни типове) до набор от редове. Това е позволено само в клаузата FROM;
Това е специална реализация на новия ROWS FROM
функция.
Вашата функция вече може да бъде просто:
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;
Обадете се:
SELECT * FROM multi_unnest(123, '{100, 40.5, 76}'::numeric[]
, '{01-2222-05,01-3333-04,01-4444-08}'::text[]);
Разбира се, простият формуляр може да бъде заменен с обикновен SQL (без допълнителна функция):
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);
В по-ранни версии (Postgres 9.3- ), можете да използвате по-малко елегантната и по-малко безопасна форма:
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;
Предупреждения за старата стенограма:освен че е нестандартна да има функция за връщане на набор в SELECT
списък, броят на върнатите редове би бил най-ниското общо кратно на броя на елементите на всеки масив (с изненадващи резултати за неравни числа). Подробности в тези свързани отговори:
- Паралелна unnest() и ред на сортиране в PostgreSQL
- Има ли нещо като функция zip() в PostgreSQL, която комбинира два масива?
Това поведение най-накрая е санирано с Postgres 10 . Множество функции за връщане на набор в SELECT
списък произвежда редове в "lock-step" сега. Вижте:
- Какво е очакваното поведение за множество функции, връщащи набор в клауза SELECT?