Postgres: обновить конкретный объект json в массиве - PullRequest
0 голосов
/ 28 октября 2018

возникли проблемы с запросами POSTGRES.

У меня есть столбец jsonb с именем venue_menu, в котором есть массив объектов, который выглядит следующим образом:

[
    { "menu_id":"0", "menu_name":"name 1"},
    { "menu_id":"1", "menu_name":"name 2"},
    { "menu_id":"2", "menu_name":"name 3"}
]

Я хочу сделать обновление,например, в объекте, где menu_id равен 2 для конкретной строки, выбранной столбцом client_id (предложение WHERE).Пока у меня есть следующий запрос

UPDATE client SET venue_menu = jsonb_set(venue_menu, '{}', { "menu_id":"2", "menu_name":"name updated"}) WHERE client_id = "1";

Я не могу понять, где выполнить запрос, который задает имя ключа объекта, который я хочу обновить, какие-либо идеи?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 22 апреля 2019

Использование jsonb_set

update "t" set "col"= jsonb_set("cols":: JSONB,('{'|| elem_index || ',"' ||'menu_name"}')::text[],'"name updated"'::jsonb,false)
from (select pos- 1 as elem_index,"col" as "cols","client_id" as "colId"
from  "t",jsonb_array_elements("t"."col" :: JSONB) with ordinality arr(elem, pos) where elem->>'menu_id' = '2') as "tble"     
where  client_id =1

DEMO

0 голосов
/ 29 октября 2018

Вы можете использовать:

  1. jsonb_to_recordset, чтобы разбить массив на строки
  2. jsonb_build_object, чтобы построить каждый элемент, используя разделенные строки
  3. jsonb_agg объединить каждый элемент в новый массив

Вот пример:

select jsonb_agg(jsonb_build_object(
    'menu_id', menu_id, 
    'menu_name', case when menu_id='2' then 'name changed' else menu_name end
  ))
  from jsonb_to_recordset('[
    { "menu_id":"0", "menu_name":"name 1"},
    { "menu_id":"1", "menu_name":"name 2"},
    { "menu_id":"2", "menu_name":"name 3"}
]') as menu_t(menu_id text, menu_name text);

Рабочий пример можно посмотреть по адресу: https://dbfiddle.uk/?rdbms=postgres_10&fiddle=147c0de2abd5d0df786ed636793f1cc8

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...