sql >> Database >  >> RDS >> PostgreSQL

Verwijder objecten in NESTED JSONB-arrays met PostgreSQL

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




  1. Hoe unieke rijen op te halen op basis van kolomwaardecombinaties?

  2. Datum van Mysql DB naar Javascript-timer

  3. Een subtekenreeks extraheren uit een tekenreeks in Oracle/SQLite

  4. PDO's lastInsertId voor MySQL een raceconditie?