Alguns RDBMSs como MySQL e MariaDB têm um
GROUP_CONCAT()
função que permite retornar uma coluna de consulta como uma lista delimitada (por exemplo, uma lista separada por vírgulas). PostgreSQL tem uma função similar chamada
STRING_AGG()
. Esta função funciona praticamente da mesma maneira que GROUP_CONCAT()
funciona em MySQL e MariaDB. Exemplo
Aqui está um exemplo básico para demonstrar como o
STRING_AGG()
do PostgreSQL função funciona:SELECT STRING_AGG(genre, ',') FROM Genres;
Resultado:
Rock,Jazz,Country,Pop,Blues,Hip Hop,Rap,Punk
Veja o que acontece quando fazemos a consulta sem o
STRING_AGG()
função:SELECT genre FROM Genres;
Resultado:
+---------+ | genre | +---------+ | Rock | | Jazz | | Country | | Pop | | Blues | | Hip Hop | | Rap | | Punk | +---------+ (8 rows)
Obtemos oito linhas, cada uma com um valor separado, em vez de uma longa linha separada por vírgulas de todos os valores.
Se alguma coisa, o
STRING_AGG()
do PostgreSQL é mais parecido com o GROUP_CONCAT()
do MySQL do que a função de mesmo nome do MariaDB. Digo isso porque o GROUP_CONCAT()
do MariaDB nos permite fornecer um LIMIT
cláusula (a partir do MariaDB 10.3.3), diretamente de dentro da própria função. MySQL GROUP_CONCAT()
não suporta o LIMIT
cláusula, e nem o STRING_AGG()
do PostgreSQL função (pelo menos, não no momento da redação deste artigo). Outra diferença é que o
STRING_AGG()
do PostgreSQL requer um segundo argumento (que especifica o delimitador a ser usado). Tanto o MySQL quanto o MariaDB tornam isso opcional com seu GROUP_CONCAT()
funções. STRING_AGG()
do Postgres aceita um ORDER BY
cláusula e um DISTINCT
cláusula (assim como o MariaDB e o GROUP_CONCAT()
do MySQL funções). Consulte
STRING_AGG()
Função no PostgreSQL para mais exemplos. E caso você esteja interessado, o SQL Server também tem um
STRING_AGG()
função que funciona praticamente da mesma maneira.