json_build_object()
w Postgresie 9.4 lub nowszym
Lub jsonb_build_object()
aby zwrócić 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;
Instrukcja:
Kompiluje obiekt JSON z variadic listy argumentów. Zgodnie z konwencją lista argumentów składa się z naprzemiennych kluczy i wartości.
Dla dowolnej wersji (w tym Postgres 9.3)
row_to_json()
z ROW
wyrażenie załatwiłoby sprawę:
SELECT value_two
, json_agg(row_to_json((value_three, value_four))) AS value_four
FROM mytable
GROUP BY value_two;
Ale tracisz oryginalne nazwy kolumn. Pozwala to uniknąć rzutowania na zarejestrowany typ wiersza. (Typ wiersza tabeli tymczasowej służy również do zapytań 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;
Lub użyj podwyboru zamiast ROW
wyrażenie. Bardziej gadatliwy, ale bez rzutowania typu:
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;
Więcej wyjaśnień w powiązanej odpowiedzi Craiga:
- PostgreSQL 9.2 row_to_json() z zagnieżdżonymi połączeniami
db<>graj tutaj
Stary sqlfiddle