Consulta de PostgreSQL para devolver resultados como una lista separada por comas

95

Digamos que tiene una SELECT id from tableconsulta (el caso real es una consulta compleja) que le devuelve varios resultados.

El problema es cómo obtener todos los idretornos en una sola fila, separados por comas.

sorin
fuente
4
posible duplicado de Postgresql GROUP_CONCAT equivalente?
podiluska
El "engañar" anterior fue relevante y útil, especialmente la array_agg()función en particular.
Jay Taylor

Respuestas:

208

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

Requiere PostgreSQL 9.0 pero eso no es un problema.

sorin
fuente
Encontré esto útil en este momento. ¡Gracias!
gooddadmike
47
Tenga en cuenta que para mí, al menos, a string_agg no le gustó tomar un int para su primer argumento, así que hice algo como: en su string_agg(CAST(id as varchar), ',')lugar.
JZC
17
@JZC, o incluso más fácil:string_agg(id::text, ',')
Alphaaa
6
Si desea ordenar la columnaselect string_agg(id, ', ' order by id desc) from table
MA Hossain Tonu
1
Me encontré con duplicados con mi consulta pero la resolví conSTRING_AGG(DISTINCT customer_name, ',')
ChristoKiwi
51

Puede utilizar las funciones array () y array_to_string () junto con su consulta. Con SELECT array( SELECT id FROM table );obtendrá un resultado como: {1,2,3,4,5,6}

Luego, si desea eliminar los signos {}, puede usar la función array_to_string () y usar una coma como separador, así: SELECT array_to_string( array( SELECT id FROM table ), ',' )obtendrá un resultado como: 1,2,3,4,5,6

Bufón
fuente
1
SELECT array_to_string( id, ',' ) AS id FROM table
Alex R.
13

Puede generar un CSV a partir de cualquier consulta SQL usando psql:

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

El archivo myfile.csv resultante tendrá los nombres de columna del conjunto de resultados SQL como encabezados de columna CSV y las tuplas de consulta como filas CSV.

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

Anthony Wang
fuente
0

use la función array_to_string () & array () para lo mismo.

select array_to_string(array(select column_name from table_name where id=5), ', ');
Ashok Parmar
fuente
¿Cómo es esto mejor que usar string_agg()?
a_horse_with_no_name
-1
SELECT array_agg(id, ',') FROM table

{1,2,3,4}

Estoy usando Postgres 11 y EntityFramework lo está obteniendo como una matriz de números enteros.

profimedica
fuente