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