PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Removendo o elemento da matriz dentro do objeto JSONB


EXCLUIR funciona em linhas de uma tabela. Portanto, você não pode usá-lo, a menos que queira remover a linha completa.

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

Agora você precisa encontrar a posição do jogador que deseja remover, digamos que você queira Rick com id 2 (menos 1 porque o índice começa em 0)
select position-1 from testing, jsonb_array_elements(value->'playersContainer'->'players') with ordinality arr(elem, position) WHERE elem->>'id' = '2';

Agora você pode combinar isso com um UPDATE instrução para atualizar o campo. Use o operador menos (-) para remover o elemento no índice desejado.
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 );

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