PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak zaktualizować głęboko zagnieżdżony obiekt JSON na podstawie kryteriów filtrowania w Postgresie?

Jeśli znasz JavaScript, z przyjemnością zainstalujesz i użyjesz języka proceduralnego JavaScript plv8. To rozszerzenie umożliwia natywną modyfikację wartości json, na przykład:

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);

Dla użytkowników MS Windows:gotowy do instalacji plików binarnych Windows.

Alternatywne rozwiązanie plpgsql wykorzystuje typ 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. Perl - DBI i .pgpass

  2. Dlaczego połączenie z moim serwerem Postgres na platformie Azure kończy się niepowodzeniem, jeśli moja aplikacja nie ma włączonego protokołu SSL?

  3. Czy PostgreSQL może wykonać łączenie między dwiema procedurami składowanymi SQL Server?

  4. Usuń wiersze z kluczem obcym w PostgreSQL

  5. Znajdowanie lasu opinającego (Z REKURSIVE, PostgreSQL 9.5)