PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Annulla l'annidamento di più array in parallelo

amerai questa nuova funzionalità di Postgres 9.4 :

unnest(anyarray, anyarray [, ...])

unnest() con la tanto attesa (almeno da me) capacità di annullare l'annidamento di più array in parallelo in modo pulito . Il manuale:

espandere più matrici (possibilmente di tipi diversi) in un insieme di righe. Questo è consentito solo nella clausola FROM;

È un'implementazione speciale del nuovo ROWS FROM caratteristica.

La tua funzione ora può essere solo:

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;

Chiama:

SELECT * FROM multi_unnest(123, '{100, 40.5, 76}'::numeric[] 
                        , '{01-2222-05,01-3333-04,01-4444-08}'::text[]);

Naturalmente, il modulo semplice può essere sostituito con SQL semplice (nessuna funzione aggiuntiva):

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);

Nelle versioni precedenti (Postgres 9.3- ), puoi utilizzare la forma meno elegante e meno sicura:

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;

Avvertenze della vecchia forma abbreviata:oltre ad essere non standard avere la funzione di restituzione del set nel SELECT list, il numero di righe restituite sarebbe il multiplo comune più basso di ogni numero di elementi di array (con risultati sorprendenti per numeri disuguali). Dettagli in queste risposte correlate:

  • Unnest() parallelo e ordinamento in PostgreSQL
  • C'è qualcosa come una funzione zip() in PostgreSQL che combina due array?

Questo comportamento è stato finalmente sanificato con Postgres 10 . Molteplici funzioni di restituzione di set in SELECT list produce righe in "lock-step" ora. Vedi:

  • Qual ​​è il comportamento previsto per più funzioni di restituzione di set nella clausola SELECT?