Du kommer att älska denna nya funktion i Postgres 9.4 :
unnest(anyarray, anyarray [, ...])
unnest()
med den mycket efterlängtade (åtminstone av mig) förmågan att rent avlösa flera arrayer parallellt . Manualen:
expandera flera arrayer (möjligen av olika typer) till en uppsättning rader. Detta är endast tillåtet i FROM-satsen;
Det är en speciell implementering av den nya ROWS FROM
funktion.
Din funktion kan nu bara vara:
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;
Ring:
SELECT * FROM multi_unnest(123, '{100, 40.5, 76}'::numeric[]
, '{01-2222-05,01-3333-04,01-4444-08}'::text[]);
Naturligtvis kan den enkla formen ersättas med vanlig SQL (ingen extra funktion):
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);
I tidigare versioner (Postgres 9.3- ), kan du använda den mindre eleganta och mindre säkra formen:
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;
Förbehåll för den gamla förkortningen:förutom att vara icke-standard att ha set-retur-funktion i SELECT
listan, skulle antalet returnerade rader vara den lägsta gemensamma multipeln av varje arrays antal element (med överraskande resultat för ojämna tal). Detaljer i dessa relaterade svar:
- Parallell unnest() och sorteringsordning i PostgreSQL
- Finns det något som en zip()-funktion i PostgreSQL som kombinerar två arrayer?
Detta beteende har äntligen sanerats med Postgres 10 . Flera set-returfunktioner i SELECT
lista producera rader i "lock-step" nu. Se:
- Vad är det förväntade beteendet för flera set-returfunktioner i SELECT-satsen?