Удалить вложенный объект json из массива в postgres

#sql #json #postgresql

#sql #json #postgresql

Вопрос:

У меня есть поле объекта json в postgres, которое имеет следующую форму

 {
"a": {
   
},
"b": [
    {
        
    }
],
"c": {
    "d": "",
    "e": [
        {
            "id": 1234,
            "f": "",
            "g": ""
        }
    ]
}
 

}

Я хотел бы знать, как написать инструкцию, которая удаляет объекты из массива e, где идентификатор равен 1234 в postgres. у e может быть несколько объектов, если в массиве e более одного объекта, я хочу сохранить их и удалить только объект с идентификатором 1234.

Спасибо

Комментарии:

1. Всегда ли он будет находиться под ключами c и e?

2. Да, он всегда будет находиться под ключами c и e @Schwern

Ответ №1:

пошаговая демонстрация: db<>скрипка

 UPDATE t 
SET data = jsonb_set(data::jsonb, '{c,e}', s.new_array::jsonb)::json   -- 4
FROM (
    SELECT
        json_agg(value) as new_array                   -- 3
    FROM
        t,
        json_array_elements(data -> 'c' -> 'e')        -- 1
    WHERE value ->> 'id' != '1234'                     -- 2
) s;
 
  1. Чтобы удалить определенный элемент из массива JSON, вам нужно развернуть его в строку для каждого элемента массива
  2. Удалите запись с элементом, который вы хотите удалить
  3. Повторно сгруппируйте массив JSON
  4. Если вы хотите выполнить UPDATE в своей таблице, вы можете использовать jsonb_set() функцию для обновления элемента JSON с помощью вашего вновь созданного массива. Если вы не используете type jsonb , вам необходимо ввести данные JSON в jsonb (и результат обратно в type json )