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

Sådan udføres opdateringsoperationer på kolonner af typen JSONB i Postgres 9.4

Hvis du er i stand til at opgradere til Postgresql 9.5, kan jsonb_set kommandoen er tilgængelig, som andre har nævnt.

I hver af de følgende SQL-sætninger har jeg udeladt where klausul for korthed; selvfølgelig vil du gerne tilføje det igen.

Opdater navn:

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

Udskift tags (i modsætning til at tilføje eller fjerne tags):

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

Udskiftning af det andet tag (0-indekseret):

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

Tilføj et tag (dette vil virke, så længe der er færre end 999 tags; ændring af argument 999 til 1000 eller derover genererer en fejl . Dette ser ikke længere ud til at være tilfældet i Postgres 9.5.3; et meget større indeks kan bruges):

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

Fjern det sidste mærke:

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

Kompleks opdatering (slet det sidste tag, indsæt et nyt tag, og skift navn):

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

Det er vigtigt at bemærke, at i hvert af disse eksempler opdaterer du faktisk ikke et enkelt felt af JSON-dataene. I stedet opretter du en midlertidig, ændret version af dataene og tildeler den ændrede version tilbage til kolonnen. I praksis bør resultatet være det samme, men at holde dette i tankerne bør gøre komplekse opdateringer, som det sidste eksempel, mere forståelige.

I det komplekse eksempel er der tre transformationer og tre midlertidige versioner:Først fjernes det sidste tag. Derefter transformeres den version ved at tilføje et nyt tag. Dernæst transformeres den anden version ved at ændre name Mark. Værdien i data kolonne erstattes med den endelige version.



  1. pgFincore 1.2, en PostgreSQL-udvidelse

  2. UnicodeEncodeError:'latin-1' codec kan ikke indkode tegn

  3. Kopier data til ny tabel i MySQL

  4. Sådan fungerer REPLACE() i MariaDB