Edit note:ik heb de vraag verkeerd begrepen. Ik dacht dat je het hele object met 'RO' wilde verwijderen. Ik heb het antwoord bewerkt om alleen de id te verwijderen.
Er is een kleine fout in het jsonb-object dat u opgeeft. Het zou er waarschijnlijk zo uit moeten zien:
{
"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"
}]
}
]
}
}
Dat gezegd hebbende, zou dit moeten werken, maar houd er rekening mee dat dit alle vermeldingen in de werktabel zal vervangen. De jsonb-objecten bevinden zich in het veld "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
Met vriendelijke groet,
Bjarni