A maioria dos principais RDBMSs tem uma função que nos permite retornar nossos resultados de consulta como uma lista separada por vírgulas.
Ou seja, podemos usar essa função para converter cada linha em um item de lista separado, dentro de uma lista separada por vírgulas.
Abaixo estão exemplos de como conseguir isso em alguns dos RDBMSs mais populares.
MySQL
MySQL tem o
GROUP_CONCAT()
função que nos permite produzir nossos resultados de consulta em uma lista separada por vírgulas:SELECT GROUP_CONCAT(PetName)
FROM Pets;
Resultado:
Fluffy,Fetch,Scratch,Wag,Tweet,Fluffy,Bark,Meow
Também podemos fazer coisas como remover valores duplicados (com o
DISTINCT
cláusula), especifique uma ordem para os resultados (com o ORDER BY
cláusula) e especifique um delimitador diferente. Veja
GROUP_CONCAT()
Function no MySQL para mais exemplos. Banco de dados Oracle
O Banco de Dados Oracle tem o
LISTAGG()
função:SELECT LISTAGG(last_name, ', ')
FROM employees
WHERE job_id = 'IT_PROG';
Resultado:
Hunold, Ernst, Austin, Pataballa, Lorentz
Assim como o MySQL, o Oracle Database também permite remover valores duplicados, especificar uma ordem para os resultados, especificar um separador diferente, etc.
Veja
LISTAGG()
Function no Oracle para mais exemplos. SQL Server
SQL Server tem o
STRING_AGG()
função para retornar nossos resultados em uma lista separada por vírgulas:SELECT STRING_AGG(Genre, ',') AS Result FROM Genres
Resultado:
Rock,Jazz,Country,Pop,Blues,Hip Hop,Rap,Punk
Também podemos remover valores duplicados, especificar uma ordem para os resultados, alterar o delimitador, etc.
Consulte Como retornar resultados de consulta como uma lista separada por vírgulas no SQL Server para obter mais exemplos.
MariaDB
Assim como o MySQL, o MariaDB também possui um
GROUP_CONCAT()
função:SELECT GROUP_CONCAT(PetName)
FROM Pets;
Resultado:
Fluffy,Fetch,Scratch,Wag,Tweet,Fluffy,Bark,Meow
Como a função de mesmo nome do MySQL, também podemos fazer coisas como, remover valores duplicados (com o
DISTINCT
cláusula), especifique uma ordem para os resultados (com o ORDER BY
cláusula), altere o separador, etc. No entanto, uma coisa que o MariaDB tem sobre o MySQL é o
LIMIT
cláusula, que nos fornece a capacidade de limitar o número de resultados na lista. Veja MariaDB
GROUP_CONCAT()
para mais exemplos. PostgreSQL
Postgres tem o
STRING_AGG()
função:SELECT STRING_AGG(PetName, ',')
FROM Pets;
Resultado:
Fluffy,Fetch,Scratch,Wag,Tweet,Fluffy,Bark,Meow
Também podemos remover valores duplicados (com o
DISTINCT
cláusula), especifique uma ordem para os resultados (com o ORDER BY
cláusula), altere o separador, etc. Consulte
STRING_AGG()
Função no PostgreSQL para mais exemplos. SQLite
No SQLite, podemos usar o
GROUP_CONCAT()
função para transformar nossos resultados de consulta em uma lista separada por vírgulas:SELECT group_concat(FirstName)
FROM Employee;
Resultado:
Andrew,Nancy,Jane,Margaret,Steve,Michael,Robert,Laura
Veja como
GROUP_CONCAT()
Funciona em SQLite para mais exemplos. Várias colunas
Todos os exemplos acima usam uma única coluna para a lista. Também podemos concatenar várias colunas para produzir uma lista que inclui várias colunas.
Suponha que temos uma tabela com os seguintes dados:
SELECT TaskId, TaskName
FROM Tasks;
Resultado:
TaskId TaskName ------ ------------ 1 Feed cats 2 Water dog 3 Feed garden 4 Paint carpet 5 Clean roof 6 Feed cats
No SQL Server, podemos fazer o seguinte para gerar as duas colunas em uma única linha:
SELECT STRING_AGG(CONCAT(TaskId, ') ', TaskName), ' ')
FROM Tasks
Resultado:
1) Feed cats 2) Water dog 3) Feed garden 4) Paint carpet 5) Clean roof 6) Feed cats