#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;
- Чтобы удалить определенный элемент из массива JSON, вам нужно развернуть его в строку для каждого элемента массива
- Удалите запись с элементом, который вы хотите удалить
- Повторно сгруппируйте массив JSON
- Если вы хотите выполнить
UPDATE
в своей таблице, вы можете использоватьjsonb_set()
функцию для обновления элемента JSON с помощью вашего вновь созданного массива. Если вы не используете typejsonb
, вам необходимо ввести данные JSON вjsonb
(и результат обратно в typejson
)