PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm cách nào để hợp nhất các bản ghi bên trong hai mảng JSON?

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:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đặt nguyên tử giá trị SERIAL khi thực hiện giao dịch

  2. SQLAlchemy - SQLite để thử nghiệm và Postgresql để phát triển - Làm thế nào để chuyển?

  3. Cách sạch sẽ để sử dụng các chức năng cửa sổ postgresql trong django ORM?

  4. Cập nhật mảng JSONB cho phần tử cụ thể

  5. Postgres CASE Statement trong một phụ trang