PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Restituisce come array di oggetti JSON in SQL (Postgres)

json_build_object() in Postgres 9.4 o versioni successive

Oppure jsonb_build_object() per restituire 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;

Il manuale:

Crea un oggetto JSON da un elenco di argomenti variadici. Per convenzione, l'elenco degli argomenti è costituito da chiavi e valori alternati.

Per qualsiasi versione (incluso Postgres 9.3)

row_to_json() con una ROW l'espressione farebbe il trucco:

SELECT value_two
     , json_agg(row_to_json((value_three, value_four))) AS value_four
FROM   mytable
GROUP  BY value_two;

Ma perdi i nomi delle colonne originali. Un cast a un tipo di riga registrato lo evita. (Il tipo di riga di una tabella temporanea serve anche per query 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;

Oppure utilizza una sottoselezione invece di ROW espressione. Più dettagliato, ma senza il cast del tipo:

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;

Maggiori spiegazioni nella risposta correlata di Craig:

  • PostgreSQL 9.2 row_to_json() con join nidificati

db<>gioca qui
Sqlfiddle vecchio