sql >> Database >  >> RDS >> PostgreSQL

Unnes meerdere arrays parallel

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?


  1. SQL Server-uitvoerclausule in een scalaire variabele

  2. (Android) Vind pad /Android in interne opslag

  3. Converteer minuten naar HH24:MI-formaat

  4. Hoe tel je alle rijen bij gebruik van SELECT met LIMIT in MySQL-query?