PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Löschen Sie Objekte in NESTED JSONB-Arrays mit PostgreSQL

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