PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да актуализирам дълбоко вложен JSON обект въз основа на критерии за филтриране в Postgres?

Ако сте запознати с JavaScript, ще се радвате да инсталирате и използвате JavaScript процедурен език plv8. Това разширение ви позволява да променяте естествено json стойностите, например:

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

За потребители на MS Windows:готов за инсталиране на двоични файлове на Windows.

Алтернативно решение на plpgsql използва тип 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. pq:функцията unnest(unknown) не е уникална

  2. Тестване на Cucumber и RSpec със zeus:Postgres е достъпен от други потребители

  3. rake db:създаване на грешка при кодиране с postgresql

  4. Наименуване на всеки ред в таблицата с произволен низ от 2 думи

  5. Как да използвате прозоречна функция, за да определите кога да изпълнявате различни задачи в Hive или Postgres?