PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Rimozione dell'elemento dall'array all'interno dell'oggetto JSONB

CANCELLA funziona su righe di una tabella. Pertanto non puoi usarlo a meno che tu non voglia rimuovere l'intera riga.

Prova questo:

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

Ora devi trovare la posizione del giocatore che vuoi rimuovere, diciamo che vuoi Rick con id 2 (meno 1 perché l'indice inizia da 0)

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

Ora puoi combinarlo con un UPDATE dichiarazione per aggiornare il campo. Usa l'operatore meno (-) per rimuovere l'elemento all'indice desiderato.

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 );

Risultato finale:

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