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