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

Bagaimana cara memodifikasi atau menghapus objek JSON tertentu dari array JSON yang disimpan dalam tipe kolom jsonb di PostgreSQL menggunakan klausa where?

Kedua masalah memerlukan unnesting dan menggabungkan kembali elemen JSON (dimodifikasi). Untuk kedua masalah tersebut, saya akan membuat fungsi untuk membuatnya lebih mudah digunakan.

create function remove_element(p_value jsonb, p_to_remove jsonb)
  returns jsonb
as
$$
  select jsonb_agg(t.element order by t.idx)  
  from jsonb_array_elements(p_value) with ordinality as t(element, idx)
  where not t.element @> p_to_remove;
$$
language sql
immutable;

Fungsinya dapat digunakan seperti ini, mis. dalam pernyataan UPDATE:

update the_table
  set the_column = remove_element(the_column, '{"ModuleId": 1}')
where ...

Untuk masalah kedua, fungsi serupa berguna.

create function change_value(p_value jsonb, p_what jsonb, p_new jsonb)
  returns jsonb
as
$$
  select jsonb_agg(
         case
           when t.element @> p_what then t.element||p_new
           else t.element
         end order by t.idx)  
  from jsonb_array_elements(p_value) with ordinality as t(element, idx);
$$
language sql
immutable;

|| operator akan menimpa kunci yang ada, jadi ini secara efektif menggantikan nama lama dengan nama baru.

Anda dapat menggunakannya seperti ini:

update the_table
  set the_column = change_value(the_column, '{"ModuleId": 1}', '{"ModuleName": "CBA"}')
where ...;

Saya pikir melewati nilai JSON sedikit lebih fleksibel daripada hardcoding kunci yang membuat penggunaan fungsi sangat terbatas. Fungsi pertama juga dapat digunakan untuk menghapus elemen array dengan membandingkan beberapa kunci.

Jika Anda tidak ingin membuat fungsi, ganti panggilan fungsi dengan select dari fungsi.



  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 menghubungkan ke database Heroku PostgreSQL saya dari Java

  2. Bilangan bulat di luar jangkauan dalam database PostgreSQL

  3. Format tanggal postgresql

  4. Npgsql - Metode yang ditentukan tidak didukung

  5. Rails:PG::InsufficientPrivilege:ERROR:izin ditolak untuk hubungan schema_migrations