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

Aplatir une relation avec un tableau pour émettre une ligne par entrée de tableau

Nous pouvons mettre la fonction de retour d'ensemble unnest() dans le SELECT list comme le suggère Raphaël . Cela présentait des problèmes de cas de coin avant Postgres 10. Voir :

Depuis Postgres 9.3, nous pouvons également utiliser un LATERAL rejoindre pour cela. C'est la manière la plus propre et la plus conforme aux normes de mettre des fonctions de retour d'ensemble dans le FROM liste, pas dans le SELECT liste :

SELECT name, value
FROM   tbl, unnest(values) value;  -- implicit CROSS JOIN LATERAL

Une différence subtile :cela supprime les lignes avec des values vides / NULL du résultat depuis unnest() renvoie aucune ligne , tandis que le même est converti en une valeur NULL dans le FROM liste et retourné de toute façon. La requête équivalente à 100 % est :

SELECT t.name, v.value
FROM   tbl t
LEFT   JOIN unnest(t.values) v(value) ON true;

Voir :