Plus simple avec la fonction d'agrégation string_agg()
(Postgres 9.0 ou version ultérieure) :
SELECT movie, string_agg(actor, ', ') AS actor_list
FROM tbl
GROUP BY 1;
Le 1
dans GROUP BY 1
est une référence de position et un raccourci pour GROUP BY movie
dans ce cas.
string_agg()
attend le type de données text
comme entrée. Les autres types doivent être castés explicitement (actor::text
) - sauf si un transtypage implicite en text
est défini - ce qui est le cas pour tous les autres types de caractères (varchar
, character
, "char"
), et quelques autres types.
Comme isapir l'a commenté, vous pouvez ajouter un ORDER BY
clause dans l'appel agrégé pour obtenir une liste triée - si vous en avez besoin. Comme :
SELECT movie, string_agg(actor, ', ' ORDER BY actor) AS actor_list
FROM tbl
GROUP BY 1;
Mais il est généralement plus rapide de trier les lignes dans une sous-requête. Voir :
- Postgres SQL - Créer un tableau dans Select