Du vil elske denne nye funktion i Postgres 9.4 :
unnest(anyarray, anyarray [, ...])
unnest()
med den længe ventede (i hvert fald af mig) evne til at fjerne flere arrays parallelt rent . Manualen:
udvide flere arrays (muligvis af forskellige typer) til et sæt rækker. Dette er kun tilladt i FROM-sætningen;
Det er en speciel implementering af den nye ROWS FROM
funktion.
Din funktion kan nu blot være:
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 til:
SELECT * FROM multi_unnest(123, '{100, 40.5, 76}'::numeric[]
, '{01-2222-05,01-3333-04,01-4444-08}'::text[]);
Selvfølgelig kan den simple form erstattes med almindelig SQL (ingen ekstra 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 tidligere versioner (Postgres 9.3- ), kan du bruge den mindre elegante og mindre sikre form:
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;
Forbehold i den gamle stenografiform:udover at være ikke-standard at have sæt-returnerende funktion i SELECT
liste, ville antallet af returnerede rækker være det laveste fælles multiplum af hvert arrays antal elementer (med overraskende resultater for ulige tal). Detaljer i disse relaterede svar:
- Parallel unnest() og sorteringsrækkefølge i PostgreSQL
- Er der noget som en zip()-funktion i PostgreSQL, der kombinerer to arrays?
Denne adfærd er endelig blevet renset med Postgres 10 . Flere sæt-returnerende funktioner i SELECT
liste producere rækker i "lock-step" nu. Se:
- Hvad er den forventede adfærd for flere sæt-returnerende funktioner i SELECT-sætning?