PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Suppression d'un élément du tableau dans l'objet JSONB

SUPPRIMER fonctionne sur les lignes d'un tableau. Par conséquent, vous ne pouvez pas l'utiliser, sauf si vous souhaitez supprimer la ligne complète.

Essayez ceci :

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

Maintenant, vous devez trouver la position du joueur que vous souhaitez supprimer, disons que vous voulez Rick avec l'identifiant 2 (moins 1 car l'index commence à 0)

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

Vous pouvez maintenant combiner cela avec une UPDATE déclaration pour mettre à jour le champ. Utilisez l'opérateur moins (-) pour supprimer l'élément à l'index souhaité.

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

Résultat final :

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