PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana saya bisa menggabungkan catatan di dalam dua array JSON?

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:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mendapatkan perbedaan hari/bulan/tahun (tanggal) antara dua tanggal?

  2. referensi tidak valid ke entri klausa FROM untuk tabel dalam kueri Postgres

  3. Hapus duplikat di postgres

  4. Opsi drop-down bentuk python diisi oleh sql

  5. Akankah Postgres menekan klausa WHERE menjadi VIEW dengan Fungsi Jendela (Agregat)?