json_build_object()
trong Postgres 9.4 hoặc mới hơn
Hoặc jsonb_build_object()
để trả về 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;
Hướng dẫn sử dụng:
Tạo một đối tượng JSON từ một danh sách đối số khác nhau. Theo quy ước, danh sách đối số bao gồm các khóa và giá trị xen kẽ.
Đối với bất kỳ phiên bản nào (bao gồm Postgres 9.3)
row_to_json()
với ROW
biểu thức sẽ thực hiện thủ thuật:
SELECT value_two
, json_agg(row_to_json((value_three, value_four))) AS value_four
FROM mytable
GROUP BY value_two;
Nhưng bạn mất tên cột ban đầu. Việc truyền đến một loại hàng đã đăng ký sẽ tránh được điều đó. (Loại hàng của bảng tạm thời cũng phục vụ cho các truy vấn đặc biệt.)
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;
Hoặc sử dụng lựa chọn phụ thay vì ROW
biểu hiện. Chi tiết hơn, nhưng không có kiểu cast:
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;
Giải thích thêm trong câu trả lời liên quan của Craig:
- PostgreSQL 9.2 row_to_json () với các phép nối lồng nhau
db <> fiddle here
Sqlfiddle cũ