json_build_object()
в Postgres 9.4 или по-нова версия
Или jsonb_build_object()
за да върнете 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;
Ръководството:
Създава JSON обект от списък с променливи аргументи. По конвенция списъкът с аргументи се състои от редуващи се ключове и стойности.
За всяка версия (включително Postgres 9.3)
row_to_json()
с ROW
израз би свършил работа:
SELECT value_two
, json_agg(row_to_json((value_three, value_four))) AS value_four
FROM mytable
GROUP BY value_two;
Но губите оригиналните имена на колони. Прехвърлянето към регистриран тип ред избягва това. (Типът на ред на временна таблица служи и за 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;
Или използвайте подселекция вместо ROW
изразяване. По-подробно, но без привеждане на типа:
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;
Повече обяснение в свързания отговор на Крейг:
- PostgreSQL 9.2 row_to_json() с вложени съединения
db<>цигулка тук
Стар sqlfiddle