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

Menggunakan jsonb_set() untuk memperbarui nilai array jsonb tertentu

Anda dapat menemukan indeks dari elemen yang dicari menggunakan jsonb_array_elements() with ordinality (catatan, ordinality dimulai dari 1 sedangkan indeks pertama dari json array adalah 0):

select 
    pos- 1 as elem_index
from 
    samples, 
    jsonb_array_elements(sample->'result') with ordinality arr(elem, pos)
where
    id = 26 and
    elem->>'8410' = 'FERR_R';

 elem_index 
------------
          2
(1 row) 

Gunakan kueri di atas untuk memperbarui elemen berdasarkan indeksnya (perhatikan bahwa argumen kedua dari jsonb_set() adalah larik teks):

update 
    samples
set
    sample = 
        jsonb_set(
            sample,
            array['result', elem_index::text, 'ratingtext'],
            '"some individual text"'::jsonb,
            true)
from (
    select 
        pos- 1 as elem_index
    from 
        samples, 
        jsonb_array_elements(sample->'result') with ordinality arr(elem, pos)
    where
        id = 26 and
        elem->>'8410' = 'FERR_R'
    ) sub
where
    id = 26;    

Hasil:

select id, jsonb_pretty(sample)
from samples;

 id |                   jsonb_pretty                   
----+--------------------------------------------------
 26 | {                                               +
    |     "result": [                                 +
    |         {                                       +
    |             "8410": "ABNDAT",                   +
    |             "8411": "Abnahmedatum"              +
    |         },                                      +
    |         {                                       +
    |             "8410": "ABNZIT",                   +
    |             "8411": "Abnahmezeit"               +
    |         },                                      +
    |         {                                       +
    |             "8410": "FERR_R",                   +
    |             "8411": "Ferritin",                 +
    |             "ratingtext": "Some individual text"+
    |         }                                       +
    |     ]                                           +
    | }
(1 row)

Argumen terakhir di jsonb_set() harus true untuk memaksa menambahkan nilai baru jika kuncinya belum ada. Namun ini dapat dilewati karena nilai defaultnya adalah true .

Meskipun masalah konkurensi tampaknya tidak mungkin (karena kondisi WHERE yang membatasi dan kemungkinan sejumlah kecil baris yang terpengaruh), Anda mungkin juga tertarik dengan Atomic UPDATE .. SELECT di Postgres.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL - Tambahkan kunci ke setiap objek dari array JSONB

  2. Tampilan Drop Postgresql

  3. PostgreSQL Naik Daun:Temuan Postgres 2018 &Tren 2019

  4. Kembalikan id jika ada baris, MASUKKAN sebaliknya

  5. Hak Istimewa PostgreSQL &Manajemen Pengguna - Yang Harus Anda Ketahui