Je zult van houden deze nieuwe functie van Postgres 9.4 :
unnest(anyarray, anyarray [, ...])
unnest()
met de langverwachte (althans door mij) mogelijkheid om meerdere arrays parallel schoon te unnesten . De handleiding:
breid meerdere arrays (mogelijk van verschillende typen) uit tot een set rijen. Dit is alleen toegestaan in de FROM-clausule;
Het is een speciale implementatie van de nieuwe ROWS FROM
functie.
Je functie kan nu gewoon zijn:
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;
Bel:
SELECT * FROM multi_unnest(123, '{100, 40.5, 76}'::numeric[]
, '{01-2222-05,01-3333-04,01-4444-08}'::text[]);
Natuurlijk kan de eenvoudige vorm worden vervangen door plain SQL (geen extra functie):
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);
In eerdere versies (Postgres 9.3- ), kunt u de minder elegante en minder veilige vorm gebruiken:
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;
Voorbehoud van de oude stenovorm:behalve dat het niet-standaard is om een set-retourfunctie te hebben in de SELECT
lijst, zou het aantal geretourneerde rijen het laagste gemene veelvoud zijn van het aantal elementen van elk array (met verrassende resultaten voor ongelijke getallen). Details in deze gerelateerde antwoorden:
- Parallel unnest() en sorteervolgorde in PostgreSQL
- Is er zoiets als een zip()-functie in PostgreSQL die twee arrays combineert?
Dit gedrag is eindelijk verholpen met Postgres 10 . Meerdere set-return functies in de SELECT
lijst produceer nu rijen in "lock-step". Zie:
- Wat is het verwachte gedrag voor functies die meerdere sets retourneren in de SELECT-component?