Удалить json объект из массива jsons в postgres - PullRequest
0 голосов
/ 07 апреля 2020

В моем столбце в базе данных posgres есть следующий json.

Элементы столбцов в табличных продуктах

{
    "name": "Super name",
    "type": "Green",
    "information": [
        {
            "name": "first",
            "value": "high"
        },
        {
            "name": "second",
            "value": "medium"
        }
    ],
}

Я хочу удалить json объект, используя jsonb

{
    "name": "second",
    "value": "medium"
}

Я пробую это:

update products set items = jsonb_set(items, '{information}', (items->'information') - '{"name": "second", "value": "medium"}');

Я пробовал разные подходы, но ничего не работает правильно.

1 Ответ

1 голос
/ 07 апреля 2020

Оператор «минус» не работает на объектах, только на клавишах. И это также не работает с массивами объектов.

Я бы написал функцию, которая удаляет один объект из массива.

create function remove_element(p_input jsonb, p_to_remove jsonb)
  returns jsonb
as
$$
  select coalesce(jsonb_agg(t.item order by t.idx), '[]')
  from jsonb_array_elements(p_input) with ordinality as t(item, idx)
  where t.item <> p_to_remove;
$$
language sql 
immutable;

Тогда вы можете использовать его так:

update products
  set items = jsonb_set(items, '{information}', remove_element(items -> 'information', '{"name": "second", "value": "medium"}')) 
where ...

Онлайн пример

...