С учетом следующей таблицы:
create table documents(docu_id text, attachments jsonb);
insert into documents values
('001',
'[
{"name": "uno","id":"1"},
{ "name": "dos","id":"2"},
{ "name": "tres","id":"3"}
]'
),
('002',
'[
{ "name": "eins","id":"1" },
{ "name": "zwei", "id":"2" }
]'
);
select * from documents;
У меня есть этот запрос postgres, который отлично работает, когда я хочу удалить с существующим идентификатором. Но когда я использую несуществующий идентификатор, все элементы внутри вложений jsonarray удаляются, как избежать этого поведения?
UPDATE documents
SET attachments = attachments #- /* #- Delete field/element with specified path */
(
'{' || /* Concat */
(
SELECT i
FROM generate_series(0, jsonb_array_length(attachments) - 1) AS i
WHERE (attachments->i->'id' = '"x"') /* <=====BUG origin */
)
|| '}'
)::text[] /* cast as text */
where docu_id = '002';
Пример ссылки с рабочими данными:
http://rextester.com/VZYSG74184