У меня есть таблица с 2 полями:
table documents
docu_id uuid
attachments jsonb
Пример данных для столбца attachments jsonb
:
[
{
"size": 10,
"attach_id": "d3a21f904068"
},{
"Size": 0.143,
"attach_id": "5ba4b285565b"
}
]
Я видел много примеров того, как обновить / удалить jsonb на основе имени поля, но можно ли удалить анонимный объект из анонимный массив, где "attach_id" = "X" and "docu_id" = "Y":
delete from documents
where docu_id = "Y"
and
where attachments @> '[{"attach_id": "X"}]'
@a_horse_with_no_name просто элемент из массива. Удалить из вложений массив jsonb, где attach_id = "X"
Хорошо, нашел решение, поэтому делюсь им здесь (ссылка на рекстестер http://rextester.com/YICZ86369):
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;
UPDATE documents
SET attachments = attachments #-
array(
SELECT i
FROM generate_series(0, jsonb_array_length(attachments) - 1) AS i
WHERE (attachments->i->'id' = '"2"')
)::text[] /* cast as text */
where docu_id = '002';
select * from documents;
Вы хотите удалить из таблицы всю строку? Или просто элемент из массива?