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

Fjerner element fra array i objekt JSONB

SLET fungerer på rækker af en tabel. Derfor kan du ikke bruge det, medmindre du vil fjerne hele rækken.

Prøv dette:

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

Nu skal du finde positionen for den spiller, du vil fjerne, lad os sige, at du vil have Rick med id 2 (minus 1, fordi indekset starter fra 0)

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

Nu kan du kombinere dette med en UPDATE erklæring for at opdatere feltet. Brug minus (-) operator for at fjerne elementet ved ønsket indeks.

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

Slutresultat:

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



  1. En god reference til Oracle PL/SQL

  2. Leder efter en rigtig EAV-struktur baseret på jsonb

  3. Oracle 10g accepterer 5-cifret årstal i en Dato

  4. Implementering af MariaDB-replikering for høj tilgængelighed