json_build_object()
dans Postgres 9.4 ou plus récent
Ou jsonb_build_object()
pour retourner jsonb
.
SELECT value_two, json_agg(json_build_object('value_three', value_three
, 'value_four' , value_four)) AS value_four
FROM mytable
GROUP BY value_two;
Le manuel :
Construit un objet JSON à partir d'une liste d'arguments variadiques. Par convention, la liste d'arguments consiste en une alternance de clés et de valeurs.
Pour toutes les versions (y compris Postgres 9.3)
row_to_json()
avec un ROW
l'expression ferait l'affaire :
SELECT value_two
, json_agg(row_to_json((value_three, value_four))) AS value_four
FROM mytable
GROUP BY value_two;
Mais vous perdez les noms de colonne d'origine. Un transtypage vers un type de ligne enregistré évite cela. (Le type de ligne d'une table temporaire sert également pour les requêtes ad hoc.)
CREATE TYPE foo AS (value_three text, value_four text); -- once in the same session
SELECT value_two
, json_agg(row_to_json((value_three, value_four)::foo)) AS value_four
FROM mytable
GROUP BY value_two;
Ou utilisez une sous-sélection au lieu de ROW
expression. Plus verbeux, mais sans conversion de type :
SELECT value_two
, json_agg(row_to_json((SELECT t FROM (SELECT value_three, value_four) t))) AS value_four
FROM mytable
GROUP BY value_two;
Plus d'explications dans la réponse connexe de Craig :
- PostgreSQL 9.2 row_to_json() avec jointures imbriquées
db<>jouez ici
Vieux sqlfiddle