sql >> Databáze >  >> RDS >> PostgreSQL

Odebrání prvku z pole v rámci objektu JSONB

SMAZAT pracuje na řádcích tabulky. Proto jej nemůžete použít, pokud nechcete odstranit celý řádek.

Zkuste toto:

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

Nyní musíte najít pozici hráče, kterého chcete odstranit, řekněme, že chcete Ricka s ID 2 (mínus 1, protože index začíná od 0)

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

Nyní to můžete zkombinovat s UPDATE prohlášení k aktualizaci pole. Pomocí operátoru minus (-) odstraňte prvek na požadovaném indexu.

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

Konečný výsledek:

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



  1. jak uložit typ data java do typu data mysql?

  2. Vybrané sloupce nemají kompatibilní typ, i když mají stejný typ

  3. Jak získat první a poslední záznam na skupinu v SQL Server 2008?

  4. Jak použít smyčku SQL for k vložení řádků do databáze?