Dengan asumsi tipe data jsonb dan Anda ingin menggabungkan catatan dari setiap larik JSON yang memiliki nilai 'id' yang sama.
Postgres 9.5
membuatnya lebih sederhana dengan gabungan baru operator || untuk jsonb nilai
:
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 memastikan Anda tidak kehilangan catatan tanpa kecocokan di larik lain.
Jenis jsonb memiliki properti yang nyaman untuk hanya menyimpan nilai terbaru untuk setiap kunci dalam catatan. Oleh karena itu, kunci 'id' duplikat dalam hasil digabungkan secara otomatis.
Manual Postgres 9.5 juga menyarankan:
Postgres 9.4
Sedikit kurang nyaman. Ide saya adalah mengekstrak elemen array, lalu mengekstrak semua pasangan kunci/nilai, UNION kedua hasil, agregat menjadi satu jsonb baru nilai per nilai id dan akhirnya digabungkan menjadi satu larik.
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;
Pemeran ke jsonb menghapus kunci duplikat. Atau Anda dapat menggunakan UNION untuk melipat duplikat (misalnya jika Anda ingin json sebagai hasil). Uji mana yang lebih cepat untuk kasus Anda.
Terkait:
- Bagaimana cara mengubah array json menjadi array postgres?
- Menggabungkan kolom JSON(B) yang digabungkan dalam kueri