json_build_object()
in Postgres 9.4 of nieuwer
Of jsonb_build_object()
om jsonb
terug te geven .
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;
De handleiding:
Bouwt een JSON-object uit een lijst met variadische argumenten. Volgens afspraak bestaat de lijst met argumenten uit afwisselende sleutels en waarden.
Voor elke versie (incl. Postgres 9.3)
row_to_json()
met een ROW
uitdrukking zou het lukken:
SELECT value_two
, json_agg(row_to_json((value_three, value_four))) AS value_four
FROM mytable
GROUP BY value_two;
Maar je verliest originele kolomnamen. Een cast naar een geregistreerd rijtype voorkomt dat. (Het rijtype van een tijdelijke tabel dient ook voor ad-hocquery's.)
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;
Of gebruik een subselect in plaats van de ROW
uitdrukking. Uitgebreider, maar zonder typecast:
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;
Meer uitleg in Craig's gerelateerde antwoord:
- PostgreSQL 9.2 row_to_json() met geneste joins
db<>viool hier
Oude sqlfiddle