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

Element aus dem Array innerhalb des Objekts JSONB entfernen

LÖSCHEN arbeitet an Zeilen einer Tabelle. Daher können Sie es nur verwenden, wenn Sie die komplette Zeile entfernen möchten.

Versuchen Sie Folgendes:

create temp table testing as
select 
    '{ "playersContainer": {
        "players": [
            {
                "id": "1",
                "name": "Nick"
            },
            {
                "id": "2",
                "name": "Rick"
            },
            {
                "id": "3",
                "name": "Trick"
            }
        ]
     }}'::jsonb as value;

Jetzt müssen Sie die Position des Spielers finden, den Sie entfernen möchten, sagen wir, Sie möchten Rick mit der ID 2 (minus 1, weil der Index bei 0 beginnt)

select position-1 from testing, jsonb_array_elements(value->'playersContainer'->'players') with ordinality arr(elem, position) WHERE elem->>'id' = '2';

Jetzt können Sie dies mit einem UPDATE kombinieren -Anweisung, um das Feld zu aktualisieren. Verwenden Sie den Minus (-)-Operator, um das Element am gewünschten Index zu entfernen.

UPDATE testing SET value = jsonb_set(value, '{playersContainer,players}', (value->'playersContainer'->'players') - (select position-1 from testing, jsonb_array_elements(value->'playersContainer'->'players') with ordinality arr(elem, position) WHERE elem->>'id' = '2')::int );

Endergebnis:

{
    "playersContainer":{
        "players":[
            {
                "id":"1",
                "name":"Nick"
            },
            {
                "id":"3",
                "name":"Trick"
            }
        ]
    }
}