Consulta PostgreSQL para retornar resultados como uma lista separada por vírgulas

93

Digamos que você tenha uma SELECT id from tableconsulta (o caso real é uma consulta complexa) que retorna vários resultados.

O problema é como obter todos os idretornos em uma única linha, separados por vírgulas?

Sorin
fonte
4
possível duplicata do Postgresql GROUP_CONCAT equivalente?
podiluska de
O "truque" acima foi relevante e útil, especialmente a array_agg()função em particular.
Jay Taylor

Respostas:

205

SELECT string_agg(id::text, ',') FROM table

Requer PostgreSQL 9.0, mas isso não é um problema.

Sorin
fonte
Achei isso útil agora. Obrigado!
gooddadmike
47
Observe que, pelo menos para mim, string_agg não gostou de tomar um int como seu primeiro argumento, então fiz algo como: em string_agg(CAST(id as varchar), ',')vez disso.
JZC
17
@JZC, ou ainda mais fácil:string_agg(id::text, ',')
Alphaaa de
6
Se você quiser classificar a colunaselect string_agg(id, ', ' order by id desc) from table
MA Hossain Tonu
1
Encontrei duplicatas com minha consulta, mas resolvi comSTRING_AGG(DISTINCT customer_name, ',')
ChristoKiwi
51

Você pode usar o conjunto de funções array () e array_to_string () com sua consulta. ComSELECT array( SELECT id FROM table ); você obterá um resultado como: {1,2,3,4,5,6}

Então, se você deseja remover os sinais {}, você pode apenas usar a função array_to_string () e usar a vírgula como separador, então: SELECT array_to_string( array( SELECT id FROM table ), ',' )obterá um resultado como: 1,2,3,4,5,6

Bobo da corte
fonte
1
SELECT array_to_string( id, ',' ) AS id FROM table
Alex R.
13

Você pode gerar um CSV a partir de qualquer consulta SQL usando psql:

$ psql
> \o myfile.csv
> \f ','  
> \a
> SELECT col1 AS column1, col2 AS column2 ... FROM ...

O myfile.csv resultante terá os nomes das colunas do conjunto de resultados SQL como cabeçalhos de coluna CSV e as tuplas de consulta como linhas CSV.

h / t http://pookey.co.uk/wordpress/archives/51-outputting-from-postgres-to-csv

Anthony Wang
fonte
0

use a função array_to_string () & array () para o mesmo.

select array_to_string(array(select column_name from table_name where id=5), ', ');
Ashok Parmar
fonte
Como isso é melhor do que usar string_agg()?
a_horse_with_no_name
-1
SELECT array_agg(id, ',') FROM table

{1,2,3,4}

Estou usando o Postgres 11 e EntityFramework o está buscando como uma matriz de inteiros.

profimedica
fonte