PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Retour en tant que tableau d'objets JSON en SQL (Postgres)

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