sql >> Base de Datos >  >> RDS >> PostgreSQL

Elimine objetos dentro de matrices NESTED JSONB con PostgreSQL

Nota de edición:entendí mal la pregunta. Pensé que quería eliminar todo el objeto que contenía 'RO'. Edité la respuesta solo para eliminar la identificación.

Hay un pequeño error en el objeto jsonb que proporciona. Probablemente debería verse así:

{
    "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"
                }]
            }
        ]
    }
}

Dicho esto, esto debería funcionar, pero tenga en cuenta que esto reemplazará todas las entradas en la tabla de trabajo. Los objetos jsonb están en el campo "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

Saludos cordiales,
Bjarni