Обновить выбранные значения в столбце jsonb, содержащем массив - PullRequest
0 голосов
/ 08 января 2019

Таблица faults содержит столбец recacc (jsonb), который содержит массив объектов json. Каждый из них содержит поле action. Если значение для action равно abc, я хочу изменить его на cba. Изменения, применяемые ко всем строкам.

[
  {
    "action": "abc",
    "created": 1128154425441
  },
  {
    "action": "lmn",
    "created": 1228154425441
  },
  {
    "action": "xyz",
    "created": 1328154425441
  }
]

Следующее не работает, возможно, из-за данных в формате массива

update faults 
  set recacc = jsonb_set(recacc,'{action}', to_jsonb('cbe'::TEXT),false) 
where recacc ->> 'action' = 'abc'

1 Ответ

0 голосов
/ 08 января 2019

Я не уверен, что это лучший вариант, но вы можете сначала получить элементы jsonb, используя jsonb_array_elements, заменить его, а затем восстановить json, используя array_agg и array_to_json.

UPDATE faults SET recacc = new_recacc::jsonb
FROM 
 (SELECT array_to_json(array_agg(s)) as new_recacc 
 FROM
   (  SELECT 
         replace(c->>'action','abc','cba') , --this to change the value
          c->>'created' FROM faults f
       cross join lateral jsonb_array_elements(f.recacc)  as c
   )  as s (action,created)
) m;

Демо

...