Vous n'êtes pas identifié(e).
Pages : 1
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
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
Pages : 1