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

UPDATE dengan jsonb_set() hanya memengaruhi satu objek dalam array bersarang

Penjelasan

Subpilih dalam FROM klausa UPDATE . Anda mengembalikan tiga baris. Tetapi setiap baris dalam tabel target hanya dapat diperbarui sekali dalam satu UPDATE memerintah. Hasilnya adalah Anda hanya melihat efek satu dari tiga baris itu.

Atau, dalam kata-kata manual :

Selain:jangan panggil subquery Anda "cte". Ini bukan Ekspresi Tabel Umum .

UPDATE yang tepat

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 di sini

Gunakan jsonb_set() pada setiap objek (elemen array) sebelum menggabungkannya kembali ke dalam array. Pertama di tingkat daun, dan lagi di tingkat yang lebih dalam.

Saya menambahkan id sebagai PRIMARY KEY Ke meja. Kami membutuhkan beberapa kolom unik untuk memisahkan baris.

ORDER BY . yang ditambahkan mungkin atau mungkin tidak diperlukan. Menambahkannya untuk menjamin pesanan asli.

Tentu saja, jika data Anda biasa seperti sampel, desain relasional dengan kolom khusus mungkin merupakan alternatif yang lebih sederhana. Lihat




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. postgres kueri dinamis

  2. Bagaimana cara mendapatkan kueri date_part untuk mencapai indeks?

  3. PostgreSQL - buat DB baru melalui pgAdmin UI

  4. Bagaimana cara menentukan "awal hari ini" di zona waktu tertentu?

  5. Knex terhubung dengan Heroku Postgres mendapatkan kesalahan?