· 4 years ago · Jun 16, 2021, 08:34 AM
1create table if not exists t (id int primary key , v jsonb);
2
3insert into t (id, v) values (1,'[{"name":"alex","phone":123456},{"name":"serg","phone":98765}]'::jsonb);
4insert into t (id, v) values (2,'[{"name":"ALEX","phone":123456},{"name":"SERG","phone":98765}]'::jsonb);
5select v from t;
6
7
8-- https://dev-gang.ru/article/kak-obnovit-obekty-vnutri-massivov-jsonb-s-pomosczu-postgresql-s036czh103/
9-- для записи с id=2 меняем у оператора с именем SERG телефон на 12
10with oper_phone as (
11 -- вычисляется индекс
12 select ('{' || index - 1 || ',phone}')::text[] as path
13 from t
14 , jsonb_array_elements(v) with ordinality arr(oper, index) -- здесь oper - запись, содержащая оператора
15 where oper->>'name' = 'SERG'
16 and id=2
17 )
18 update t
19 set v = jsonb_set(v, oper_phone.path, '12', false)
20 from oper_phone
21 where id=2;
22