sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man utför uppdateringsoperationer på kolumner av typen JSONB i Postgres 9.4

Om du kan uppgradera till Postgresql 9.5, jsonb_set kommandot är tillgängligt, som andra har nämnt.

I var och en av följande SQL-satser har jag utelämnat where klausul för korthet; självklart vill du lägga till det igen.

Uppdatera namn:

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

Ersätt taggarna (i motsats till att lägga till eller ta bort taggar):

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

Ersätter den andra taggen (0-indexerad):

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

Lägg till en tagg (detta fungerar så länge det finns färre än 999 taggar; ändra argument 999 till 1000 eller högre genererar ett fel . Detta verkar inte längre vara fallet i Postgres 9.5.3; ett mycket större index kan användas):

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

Ta bort den sista taggen:

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

Komplex uppdatering (ta bort den sista taggen, infoga en ny tagg och ändra namnet):

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

Det är viktigt att notera att i vart och ett av dessa exempel uppdaterar du faktiskt inte ett enda fält av JSON-data. Istället skapar du en tillfällig, modifierad version av data och tilldelar den ändrade versionen tillbaka till kolumnen. I praktiken bör resultatet bli detsamma, men att ha detta i åtanke bör göra komplexa uppdateringar, som det förra exemplet, mer begripliga.

I det komplexa exemplet finns det tre transformationer och tre temporära versioner:Först tas den sista taggen bort. Sedan omvandlas den versionen genom att lägga till en ny tagg. Därefter transformeras den andra versionen genom att ändra name fält. Värdet i data kolumnen ersätts med den slutliga versionen.



  1. Hämta poster där json-kolumnnyckeln är null

  2. Kloning av databaser med PSDatabaseClone

  3. Hur BIN() fungerar i MariaDB

  4. Oracle-XMLTYPE:Hur man uppdaterar ett värde