json_build_object()
i Postgres 9.4 eller senare
Eller jsonb_build_object()
för att returnera 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;
Manualen:
Bygger ett JSON-objekt av en variadisk argumentlista. Enligt konventionen består argumentlistan av alternerande nycklar och värden.
För alla versioner (inkl. Postgres 9.3)
row_to_json()
med en ROW
uttryck skulle göra susen:
SELECT value_two
, json_agg(row_to_json((value_three, value_four))) AS value_four
FROM mytable
GROUP BY value_two;
Men du förlorar ursprungliga kolumnnamn. En cast till en registrerad radtyp undviker det. (Radtypen för en temporär tabell fungerar också för ad hoc-frågor.)
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;
Eller använd ett underval istället för ROW
uttryck. Mer utförlig, men utan typavsnitt:
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;
Mer förklaring i Craigs relaterade svar:
- PostgreSQL 9.2 row_to_json() med kapslade kopplingar
db<>spela här
Gammal sqlfiddle