Giả định kiểu dữ liệu jsonb
và bạn muốn hợp nhất các bản ghi của từng mảng JSON có cùng giá trị 'id'.
Postgres 9.5
làm cho nó đơn giản hơn với kết hợp toán tử ||
cho jsonb
giá trị
:
SELECT json_agg(elem1 || elem2) AS result
FROM (
SELECT elem1->>'id' AS id, elem1
FROM (
SELECT '[
{"id":1, "percent":12.50},
{"id":2, "percent":75.00},
{"id":3, "percent":12.50}
]'::jsonb AS js
) t, jsonb_array_elements(t.js) elem1
) t1
FULL JOIN (
SELECT elem2->>'id' AS id, elem2
FROM (
SELECT '[
{"id": 1, "a": "text1a", "b": "text1b", "percent":12.50},
{"id": 2, "a": "text2a", "b": "text2b", "percent":75.00},
{"id": 3, "a": "text3a", "b": "text3b", "percent":12.50}]'::jsonb AS js
) t, jsonb_array_elements(t.js) elem2
) t2 USING (id);
FULL [OUTER] JOIN
đảm bảo rằng bạn không bị mất bản ghi mà không có kết quả khớp trong mảng khác.
Loại jsonb
có thuộc tính tiện lợi là chỉ giữ giá trị mới nhất cho mỗi khóa trong bản ghi. Do đó, khóa 'id' trùng lặp trong kết quả được hợp nhất tự động.
Sách hướng dẫn Postgres 9.5 cũng khuyên:
Postgres 9.4
Có một chút ít thuận tiện hơn. Ý tưởng của tôi là trích xuất các phần tử của mảng, sau đó trích xuất tất cả các cặp khóa / giá trị, UNION
cả hai kết quả, tổng hợp thành một jsonb
mới giá trị trên mỗi giá trị id và cuối cùng tổng hợp thành một mảng.
SELECT json_agg(j) -- ::jsonb
FROM (
SELECT json_object_agg(key, value)::jsonb AS j
FROM (
SELECT elem->>'id' AS id, x.*
FROM (
SELECT '[
{"id":1, "percent":12.50},
{"id":2, "percent":75.00},
{"id":3, "percent":12.50}]'::jsonb AS js
) t, jsonb_array_elements(t.js) elem, jsonb_each(elem) x
UNION ALL -- or UNION, see below
SELECT elem->>'id' AS id, x.*
FROM (
SELECT '[
{"id": 1, "a": "text1a", "b": "text1b", "percent":12.50},
{"id": 2, "a": "text2a", "b": "text2b", "percent":75.00},
{"id": 3, "a": "text3a", "b": "text3b", "percent":12.50}]'::jsonb AS js
) t, jsonb_array_elements(t.js) elem, jsonb_each(elem) x
) t
GROUP BY id
) t;
Truyền tới jsonb
loại bỏ các khóa trùng lặp. Ngoài ra, bạn có thể sử dụng UNION
để gấp các bản sao (ví dụ:nếu bạn muốn json
kết quả là). Kiểm tra cái nào nhanh hơn cho trường hợp của bạn.
Có liên quan: