Requête PostgreSQL pour renvoyer les résultats sous forme de liste séparée par des virgules

94

Supposons que vous ayez une SELECT id from tablerequête (le cas réel est une requête complexe) qui vous renvoie plusieurs résultats.

Le problème est de savoir comment obtenir tous les idretours sur une seule ligne, séparés par des virgules?

Sorin
la source
4
duplication possible de l' équivalent
podiluska
La "dupe" ci-dessus était pertinente et utile, en particulier la array_agg()fonction en particulier.
Jay Taylor

Réponses:

207

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

Nécessite PostgreSQL 9.0 mais ce n'est pas un problème.

Sorin
la source
J'ai trouvé cela utile tout à l'heure. Merci!
gooddadmike
47
Notez que pour moi au moins, string_agg n'aimait pas prendre un int pour son premier argument, alors j'ai fait quelque chose comme: à la string_agg(CAST(id as varchar), ',')place.
JZC
17
@JZC, ou encore plus simple:string_agg(id::text, ',')
Alphaaa
6
Si vous vouliez trier la colonneselect string_agg(id, ', ' order by id desc) from table
MA Hossain Tonu
1
J'ai rencontré des doublons avec ma requête, mais je l'ai résolu avecSTRING_AGG(DISTINCT customer_name, ',')
ChristoKiwi
51

Vous pouvez utiliser les fonctions array () et array_to_string () avec votre requête. Avec SELECT array( SELECT id FROM table );vous obtiendrez un résultat comme: {1,2,3,4,5,6}

Ensuite, si vous souhaitez supprimer les signes {}, vous pouvez simplement utiliser la fonction array_to_string () et utiliser la virgule comme séparateur, donc: SELECT array_to_string( array( SELECT id FROM table ), ',' )obtiendra un résultat comme: 1,2,3,4,5,6

bouffon
la source
1
SELECT array_to_string( id, ',' ) AS id FROM table
Alex R.
13

Vous pouvez générer un CSV à partir de n'importe quelle requête SQL à l'aide de psql:

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

Le fichier myfile.csv résultant aura les noms de colonne de l'ensemble de résultats SQL comme en-têtes de colonne CSV et les tuples de requête comme lignes CSV.

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

Anthony Wang
la source
0

utilisez la fonction array_to_string () & array () pour la même chose.

select array_to_string(array(select column_name from table_name where id=5), ', ');
Ashok Parmar
la source
En quoi est-ce mieux que d'utiliser string_agg()?
a_horse_with_no_name
-1
SELECT array_agg(id, ',') FROM table

{1,2,3,4}

J'utilise Postgres 11 et EntityFramework le récupère sous forme de tableau d'entiers.

profimedica
la source