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

Jak provádět operace aktualizace na sloupcích typu JSONB v Postgresu 9.4

Pokud jste schopni upgradovat na Postgresql 9.5, jsonb_set příkaz je k dispozici, jak již uvedli ostatní.

V každém z následujících příkazů SQL jsem vynechal where doložka pro stručnost; samozřejmě byste to chtěli přidat zpět.

Aktualizovat název:

UPDATE test SET data = jsonb_set(data, '{name}', '"my-other-name"');

Nahraďte značky (na rozdíl od přidávání nebo odebírání značek):

UPDATE test SET data = jsonb_set(data, '{tags}', '["tag3", "tag4"]');

Nahrazení druhé značky (indexované 0):

UPDATE test SET data = jsonb_set(data, '{tags,1}', '"tag5"');

Připojte značku (to bude fungovat, pokud bude méně než 999 značek; změna argumentu 999 na 1000 nebo vyšší způsobí chybu . Zdá se, že toto již není případ Postgres 9.5.3; lze použít mnohem větší index):

UPDATE test SET data = jsonb_set(data, '{tags,999999999}', '"tag6"', true);

Odstraňte poslední značku:

UPDATE test SET data = data #- '{tags,-1}'

Komplexní aktualizace (smažte poslední značku, vložte novou značku a změňte název):

UPDATE test SET data = jsonb_set(
    jsonb_set(data #- '{tags,-1}', '{tags,999999999}', '"tag3"', true), 
    '{name}', '"my-other-name"');

Je důležité si uvědomit, že v každém z těchto příkladů ve skutečnosti neaktualizujete jediné pole dat JSON. Místo toho vytváříte dočasnou upravenou verzi dat a přiřazujete tuto upravenou verzi zpět ke sloupci. V praxi by měl být výsledek stejný, ale s ohledem na to by komplexní aktualizace, jako je poslední příklad, měly být srozumitelnější.

Ve složitém příkladu existují tři transformace a tři dočasné verze:Nejprve je odstraněna poslední značka. Poté se tato verze transformuje přidáním nové značky. Dále je druhá verze transformována změnou name pole. Hodnota v data sloupec je nahrazen konečnou verzí.



  1. Základní SQL dotazy

  2. SQL se připojí

  3. MySQL - Spouštěč pro aktualizaci stejné tabulky po vložení

  4. Kumulativně přidejte chybějící data z předchozího měsíce nebo roku