Mais simples com a função agregada
string_agg()
(Postgres 9.0 ou posterior):SELECT movie, string_agg(actor, ', ') AS actor_list
FROM tbl
GROUP BY 1;
O
1
em GROUP BY 1
é uma referência posicional e um atalho para GROUP BY movie
nesse caso. string_agg()
espera o tipo de dados text
como entrada. Outros tipos precisam ser convertidos explicitamente (actor::text
) - a menos que uma conversão implícita para text
está definido - que é o caso de todos os outros tipos de caracteres (varchar
, character
, "char"
), e alguns outros tipos. Como isapir comentou, você pode adicionar um
ORDER BY
cláusula na chamada agregada para obter uma lista classificada - caso você precise disso. Como:SELECT movie, string_agg(actor, ', ' ORDER BY actor) AS actor_list
FROM tbl
GROUP BY 1;
Mas normalmente é mais rápido classificar linhas em uma subconsulta. Ver:
- Postgres SQL - Criar matriz em seleção