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

CẬP NHẬT với jsonb_set () chỉ ảnh hưởng đến một đối tượng trong mảng lồng nhau

Giải thích

Lựa chọn con trong FROM mệnh đề UPDATE của bạn trả về ba hàng. Nhưng mọi hàng trong bảng mục tiêu chỉ có thể được cập nhật một lần trong một UPDATE duy nhất yêu cầu. Kết quả là bạn chỉ thấy tác dụng của một trong số ba hàng đó.

Hoặc, theo cách nói của hướng dẫn sử dụng :

Ngoài ra:không gọi truy vấn con của bạn là "cte". Nó không phải là Biểu thức bảng phổ biến .

UPDATE thích hợp

UPDATE table_ t
SET    value_ = jsonb_set(value_, '{iProps}', sub2.new_prop, false)
FROM  (
   SELECT id
        , jsonb_agg(jsonb_set(prop, '{value, rules}', new_rules, false)
                    ORDER BY idx1) AS new_prop
   FROM  (
      SELECT t.id, arr1.prop, arr1.idx1
           , jsonb_agg(jsonb_set(rule, '{ao,sc}', rule #> '{ao,sc,name}', false)
                       ORDER BY idx2) AS new_rules
      FROM table_ t
         , jsonb_array_elements(value_->'iProps')       WITH ORDINALITY arr1(prop,idx1)
         , jsonb_array_elements(prop->'value'->'rules') WITH ORDINALITY arr2(rule,idx2)
      GROUP  BY t.id, arr1.prop, arr1.idx1
      ) sub1
   GROUP  BY id
   ) sub2
WHERE t.id = sub2.id;

db <> fiddle tại đây

Sử dụng jsonb_set() trên mỗi đối tượng (phần tử mảng) trước khi tổng hợp chúng lại thành một mảng. Đầu tiên ở cấp độ lá và một lần nữa ở cấp độ sâu hơn.

Tôi đã thêm id dưới dạng PRIMARY KEY để bàn. Chúng tôi cần một số cột duy nhất để giữ các hàng riêng biệt.

ORDER BY được thêm vào có thể được yêu cầu hoặc không. Đã thêm nó để đảm bảo đơn đặt hàng ban đầu.

Tất nhiên, nếu dữ liệu của bạn đều đặn như mẫu, thì một thiết kế quan hệ với các cột chuyên dụng có thể là giải pháp thay thế đơn giản hơn. Xem




  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ại sao việc giảm một chỉ mục lại mất nhiều thời gian hơn so với việc tạo ra nó?

  2. Làm cách nào để tạo đa giác bằng cách sử dụng các trường trong PostgreSQL?

  3. Các cải tiến về báo cáo tiến độ trong PostgreSQL 12

  4. Tìm giá trị băm của một hàng trong postgresql

  5. Hành vi KHÔNG THÍCH với giá trị NULL