Anmerkung editieren:Ich habe die Frage falsch verstanden. Ich dachte, Sie wollten das gesamte Objekt löschen, das 'RO' enthält. Ich habe die Antwort so bearbeitet, dass nur die ID gelöscht wird.
In dem von Ihnen bereitgestellten jsonb-Objekt ist ein kleiner Fehler aufgetreten. Es sollte wahrscheinlich so aussehen:
{
"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"
}]
}
]
}
}
Abgesehen davon sollte dies funktionieren, aber denken Sie daran, dass dadurch alle Einträge in der Arbeitstabelle ersetzt werden. Die jsonb-Objekte befinden sich im Feld „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
Viele Grüße,
Bjarni