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

Bagaimana cara memperbarui objek JSON yang sangat bersarang berdasarkan kriteria filter di Postgres?

Jika Anda terbiasa dengan JavaScript, Anda akan dengan senang hati menginstal dan menggunakan bahasa prosedural JavaScript plv8. Ekstensi ini memungkinkan Anda untuk mengubah nilai json secara asli, contoh:

create extension if not exists plv8;

create or replace function update_mapping_v8(data json)
returns json language plv8 as $$
    var len = data['mapping'].length;
    for (var i = 0; i < len; i++) {
        var o = data['mapping'][i];
        if (o.src == 'up' && o.dest == 'down') {
            o.rule_names = 'some name'
        }
    }
    return data;
$$;

update mapping_transform
set content_json = update_mapping_v8(content_json);

Untuk pengguna MS Windows:siap menginstal binari Windows.

Solusi alternatif plpgsql menggunakan tipe jsonb:

create or replace function update_mapping_plpgsql(data jsonb)
returns json language plpgsql as $$
declare
    r record;
begin
    for r in
        select value, ordinality- 1 as pos
        from jsonb_array_elements(data->'mapping') with ordinality
        where value->>'src' = 'up' and value->>'dest' = 'down'
    loop
        data = jsonb_set(
            data,
            array['mapping', r.pos::text],
            r.value || '{"rule_names": "some name"}'
            );
    end loop;
    return data;
end $$;

update mapping_transform
set content_json = update_mapping_plpgsql(content_json::jsonb);


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tampilan PostgreSQL:Merujuk satu bidang terhitung di bidang terhitung lainnya

  2. Tidak dapat terhubung ke database Postgres dengan tumpukan Bitnami Django

  3. Batasan penurunan PostgreSQL dengan nama yang tidak dikenal

  4. Ubah bahasa sistem dan pesan kesalahan di PostgreSQL

  5. Postgres baru saja berhenti bekerja secara acak (Rails, PGSQL.5432)