Postgresql GROUP_CONCAT équivalent?

J’ai un tableau et j’aimerais tirer une ligne par identifiant avec les valeurs de champ concaténées.

Dans ma table, par exemple, j’ai ceci:

TM67 | 4 | 32556 TM67 | 9 | 98200 TM67 | 72 | 22300 TM99 | 2 | 23009 TM99 | 3 | 11200 

Et j’aimerais sortir:

 TM67 | 4,9,72 | 32556,98200,22300 TM99 | 2,3 | 23009,11200 

En MySQL, j’ai pu utiliser la fonction d’agrégat GROUP_CONCAT , mais cela ne semble pas fonctionner ici … Y a-t-il un équivalent pour PostgreSQL ou une autre façon d’y parvenir?

C’est probablement un bon sharepoint départ (version 8.4+ uniquement):

 SELECT id_field, array_agg(value_field1), array_agg(value_field2) FROM data_table GROUP BY id_field 

array_agg renvoie un tableau, mais vous pouvez le convertir en texte et le modifier si nécessaire (voir les précisions ci-dessous).

Avant la version 8.4, vous devez le définir vous-même avant de l’utiliser:

 CREATE AGGREGATE array_agg (anyelement) ( sfunc = array_append, stype = anyarray, initcond = '{}' ); 

(paraphrasé à partir de la documentation de PostgreSQL)

Clarifications:

  • Le résultat de la conversion d’un tableau en texte est que la chaîne résultante commence et se termine par des accolades. Ces accolades doivent être supprimées par une méthode, si elles ne sont pas désirées.
  • Convertir ANYARRAY en TEXT simule mieux la sortie CSV car les éléments contenant des virgules incorporées sont entre guillemets dans la sortie dans un style CSV standard. Ni array_to_ssortingng () ni ssortingng_agg () (la fonction “group_concat” ajoutée au 9.1) ne citent des chaînes avec des virgules incorporées, ce qui entraîne un nombre incorrect d’éléments dans la liste résultante.
  • La nouvelle fonction 9.1 ssortingng_agg () ne lance PAS les résultats internes en premier. Donc “ssortingng_agg (value_field)” génèrerait une erreur si value_field est un entier. “ssortingng_agg (value_field :: text)” serait requirejs. La méthode array_agg () ne nécessite qu’une seule dissortingbution après l’agrégation (plutôt qu’une conversion par valeur).

Depuis 9.0, c’est encore plus facile:

 SELECT id, ssortingng_agg(some_column, ',') FROM the_table GROUP BY id 
 SELECT array_to_ssortingng(array(SELECT a FROM b),', '); 

Fera aussi bien.

Essayez comme ceci:

 select field1, array_to_ssortingng(array_agg(field2), ',') from table1 group by field1;