PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Désimbriquer plusieurs baies en parallèle

Vous allez aimer cette nouvelle fonctionnalité de Postgres 9.4 :

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

unnest() avec la capacité tant attendue (du moins par moi) de désimbriquer plusieurs baies en parallèle proprement . Le manuel :

développer plusieurs tableaux (éventuellement de types différents) en un ensemble de lignes. Ceci n'est autorisé que dans la clause FROM ;

C'est une implémentation spéciale du nouveau ROWS FROM fonctionnalité.

Votre fonction peut maintenant être :

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;

Appel :

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

Bien sûr, la forme simple peut être remplacée par du plain SQL (pas de fonction supplémentaire) :

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

Dans les versions antérieures (Postgres 9.3- ), vous pouvez utiliser la forme la moins élégante et la moins sûre :

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;

Mises en garde de l'ancienne forme abrégée :en plus d'être non standard pour avoir une fonction de retour d'ensemble dans le SELECT list, le nombre de lignes renvoyées serait le plus petit commun multiple du nombre d'éléments de chaque tableau (avec des résultats surprenants pour les nombres inégaux). Détails dans ces réponses associées :

  • Unnest() parallèle et ordre de tri dans PostgreSQL
  • Existe-t-il quelque chose comme une fonction zip() dans PostgreSQL qui combine deux tableaux ?

Ce comportement a finalement été aseptisé avec Postgres 10 . Plusieurs fonctions de retour d'ensemble dans le SELECT list produit des lignes en "lock-step" maintenant. Voir :

  • Quel est le comportement attendu pour plusieurs fonctions renvoyant des ensembles dans la clause SELECT ?