Chỉnh sửa ghi chú:Tôi đã hiểu sai câu hỏi. Nghĩ rằng bạn muốn xóa toàn bộ đối tượng có chứa 'RO'. Tôi đã chỉnh sửa câu trả lời chỉ để xóa id.
Có một lỗi nhỏ trong đối tượng jsonb mà bạn cung cấp. Nó có thể trông như thế này:
{
"x1": "Americas",
"x2": "West",
"x3": [{
"x_id": "sam"
}],
"x4": {
"a1": true,
"a2": false,
"a3": [
"xx",
"xx"
],
"a4": [
"Josh"
],
"y1": [{
"id": "RW",
"z2": true,
"z3": "USER",
"z4": [{
"name": "john"
}]
},
{
"id": "RO",
"z2": false,
"z3": "SELECT",
"z4": [{
"name": "salin"
}]
},
{
"id": "DBA",
"z2": false,
"z3": "SELECT",
"z4": [{
"name": "Samule"
}]
}
]
}
}
Như đã nói, điều này sẽ hoạt động, nhưng hãy lưu ý - điều này sẽ thay thế tất cả các mục nhập trong bảng làm việc. Các đối tượng jsonb nằm trong trường "field".
with zd as (select ('{x4,y1,'||index-1||',id}')::text[] as path
from table
,jsonb_array_elements((field->>'x4')::jsonb->'y1')
with ordinality arr(x,index)
where x->>'id'='RO'
)
update table set field=
field #- zd.path
from zd
Trân trọng,
Bjarni