sql >> Database teknologi >  >> RDS >> SQLite

SQLite JSON_REPLACE()

SQLite json_replace() funktion giver os mulighed for at erstatte en eksisterende værdi i et JSON-dokument med en anden værdi.

Vi sender den originale JSON som det første argument, når vi kalder funktionen, efterfulgt af stien til den værdi, der skal erstattes, efterfulgt af den værdi, der skal erstattes.

Vi kan også erstatte flere nøgle/værdi-par, hvis det kræves.

Syntaks

Det fungerer sådan her:

json_replace(json, path1, value1, path2, value2...)

Hvor json repræsenterer den originale JSON og path1, value1, path2, value2... er sti/værdi-par, der skal erstattes.

Eksempel

Her er et grundlæggende eksempel for at demonstrere:

SELECT json_replace('{ "name" : "Fluffy" }', '$.name', "Baldy");

Resultat:

{"name":"Baldy"}

Her opdaterede jeg værdien af ​​name nøgle fra Fluffy til Baldy .

Vi kan opdatere flere nøgle/værdi-par som dette:

SELECT json_replace('{ 
    "name" : "Fluffy", 
    "age" : 10
    }', 
    '$.name', "Baldy", 
    '$.age', 11 
    );

Resultat:

{"name":"Baldy","age":11}

Jeg tilføjede simpelthen flere nøgle/værdi-argumenter, da jeg kaldte json_replace() .

Her brugte jeg linjeskift for at gøre koden nemmere at læse. Det hele kunne have været på én linje – resultatet ville have været det samme.

Hvad hvis nøglen ikke eksisterer?

Hvis nøglen ikke allerede findes i JSON, erstattes intet:

SELECT json_replace('{ "name" : "Fluffy" }', '$.age', 11);

Resultat:

{"name":"Fluffy"}

Dette er hovedkarakteristikken, der adskiller json_replace() funktion fra json_set() og json_insert() funktioner. Disse funktioner vil indsætte værdien, hvis nøglen ikke allerede eksisterer.

Det er dog muligt effektivt at indsætte nye nøgler med json_replace() ved at erstatte hele JSON-objektet/dokumentet. Eksempel nedenfor.

Erstat hele JSON-dokumentet

Vi kan bruge json_replace() for at erstatte hele JSON-dokumentet med et andet:

SELECT json_replace('{ "name" : "Fluffy" }', '$', json('{ "name" : "Baldy" }') );

Resultat:

{"name":"Baldy"}

Så dette gør os i stand til effektivt at indsætte nye nøgler i dokumentet:

SELECT json_replace('{ 
    "name" : "Fluffy" 
    }', 
    '$', 
    json('{ 
        "name" : "Baldy" ,
        "age" : 11
        }'
    ) 
);

Resultat:

{"name":"Baldy","age":11}

Strengt taget har vi ikke indsat nogen nye nøgler. Vi erstattede simpelthen hele dokumentet. Men resultatet var et JSON-dokument, der indeholder nøgler, som det originale ikke indeholdt.

Erstat et indlejret objekt

Vi kan også erstatte indlejrede objekter:

SELECT json_replace('
    { 
        "a" : 1, 
        "b" : { "c" : 1 } 
    }', 
    '$.b', 
    json('{ "c" : 2 }') 
    );

Resultat:

{"a":1,"b":{"c":2}}

Da jeg gjorde dette, brugte jeg json() funktion for at returnere mit argument som en JSON-streng. Her er, hvad der sker, når jeg ikke gør det:

SELECT json_replace('
    { 
        "a" : 1, 
        "b" : { "c" : 1 } 
    }', 
    '$.b', 
    '{ "c" : 2 }' 
    );

Resultat:

{"a":1,"b":"{ \"c\" : 2 }"}

JSON-dokumentet indsættes som en tekstværdi i stedet for et JSON-objekt, og dets dobbelte anførselstegn undgås derfor med omvendte skråstreg.

Vi kan dog ikke bare fjerne de enkelte anførselstegn, fordi dette resulterer i en fejl:

SELECT json_replace('
    { 
        "a" : 1, 
        "b" : { "c" : 1 } 
    }', 
    '$.b', 
    { "c" : 2 }
    );

Resultat:

Parse error: unrecognized token: "{"
        "b" : { "c" : 1 }      }',      '$.b',      { "c" : 2 }     );
                                      error here ---^

Uden enkelte anførselstegn eller json() funktion, får vi en fejl, så snart den støder på den venstre krøllede bøjle. Vi skal derfor bruge enkelte anførselstegn eller json() funktion, afhængigt af om vi indsætter et JSON-objekt eller en SQL-streng/tekstværdi.

En anden måde at indsætte et JSON-objekt på er at bruge json_object() funktion i stedet for json() funktion:

SELECT json_replace('
    { 
        "a" : 1, 
        "b" : { "c" : 1 } 
    }', 
    '$.b', 
    json_object('c', 2) 
    );

Resultat:

{"a":1,"b":{"c":2}}

Erstat et array

Det samme koncept gælder for arrays:

SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', json('[ 5, 6, 7 ]'));

Resultat:

{"a":[5,6,7]}

Hvis vi fjerner json() funktion, får vi dette:

SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', '[ 5, 6, 7 ]');

Resultat:

{"a":"[ 5, 6, 7 ]"}

Og hvis vi fjerner de enkelte anførselstegn, får vi en fejlmeddelelse:

SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', [ 5, 6, 7 ]);

Resultat:

Parse error: no such column:  5, 6, 7  (17)
  LECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', [ 5, 6, 7 ]);
                                      error here ---^

Vi kan alternativt bruge json_array() funktion i stedet for json() . Denne funktion giver dig mulighed for at oprette et array baseret på dets argumenter:

SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', json_array(5, 6, 7));

Resultat:

{"a":[5,6,7]}

Tilføj værdier til slutningen af ​​et array

For at tilføje værdier til slutningen af ​​et array kan vi bruge enten json_insert() eller json_set() funktioner.

Men hvis vi skal bruge json_replace() , kan vi erstatte hele arrayet med et andet, der har den/de ekstra værdi(er) tilføjet til slutningen af ​​arrayet:

SELECT json_replace('[ 1, 2, 3 ]', '$', json('[ 1, 2, 3, 4 ]') );

Resultat:

[1,2,3,4]

Men som nævnt, json_insert() og json_set() giver dig mulighed for faktisk at tilføje værdier til arrayet uden at erstatte hele arrayet.

Erstat array-elementer

Her er et eksempel på brug af json_replace() for at erstatte et element i et array:

SELECT json_replace('[ 1, 2, 3 ]', '$[1]', 4 );

Resultat:

[1,4,3]

Arrays er nul-baserede, og så [1] angiver det andet array-element.

json_set() funktion kan også bruges til at erstatte eksisterende elementer. Men json_insert() funktion tillader os ikke at erstatte eksisterende elementer.

Ugyldige stier

Vi får en fejl, hvis vores vej ikke er veludformet:

SELECT json_replace('{ "a" : 1 }', 'a', 2);

Resultat:

Runtime error: JSON path error near 'a'

I dette tilfælde glemte jeg at inkludere $. forrest på stien.

Ugyldige JSON-dokumenter

Vi får også en fejl, JSON er ikke veludformet:

SELECT json_replace('{ "a" : 1', '$.a', 2);

Resultat:

Runtime error: malformed JSON

Denne gang fortæller fejlen os, at vores JSON er forkert udformet.


  1. Sådan bruger du Decode i Oracle

  2. Postgres 9.1 vs Mysql 5.6 InnoDB?

  3. Forskellen mellem en bruger og et login i SQL Server

  4. gemme arabisk i SQL-database