PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 04/11/2013 01:17:46

Diway
Membre

json_agg et group by ?

Bonjour,

J'ai une table avec 3 colonnes: id, val1, val2.

Je voudrais faire un group by sur la colonne id et récupérer une seconde colonne contenant val1 et val2 au format json. Par exemple:

id 1 => [{"val1": "xxx", "val2": "yyy"}, {"val1": "aaa", "val2": "bbb"}]
id 2 => [{"val1": "ttt", "val2": "rrr"}]

point important: je veux conserver les noms de mes champs "val1" et "val2" (pas de f1, f2...)

Une idée ? Merci d'avance !

Hors ligne

#2 05/11/2013 22:40:36

gleu
Administrateur

Re : json_agg et group by ?

Il faut créer un type pour le faire. Par exemple :

postgres=# create type test as (val1 text, val2 text);
CREATE TYPE
postgres=# select id, row_to_json(row(toto.val1, toto.val2)::test) from toto;
 id |         row_to_json         
----+-----------------------------
  1 | {"val1":"xxx","val2":"yyy"}
  1 | {"val1":"aaa","val2":"bbb"}
  2 | {"val1":"ttt","val2":"rrr"}
(3 rows)

postgres=# select id, json_agg(row_to_json(row(toto.val1, toto.val2)::test)) from toto group by 1;
 id |                          json_agg                          
----+------------------------------------------------------------
  1 | [{"val1":"xxx","val2":"yyy"}, {"val1":"aaa","val2":"bbb"}]
  2 | [{"val1":"ttt","val2":"rrr"}]
(2 rows)

Sans passer par un type, il faudra accepter de récupérer toutes les colonnes, comme ceci :

postgres=# select id, json_agg(row_to_json(toto)) from toto group by 1;
 id |                                 json_agg                                 
----+--------------------------------------------------------------------------
  1 | [{"id":1,"val1":"xxx","val2":"yyy"}, {"id":1,"val1":"aaa","val2":"bbb"}]
  2 | [{"id":2,"val1":"ttt","val2":"rrr"}]
(2 rows)

Guillaume.

Hors ligne

Pied de page des forums