sql >> Databasteknik >  >> RDS >> SQLite

SQLite JSON_REPLACE()

SQLite json_replace() funktion låter oss ersätta ett befintligt värde i ett JSON-dokument med ett annat värde.

Vi skickar den ursprungliga JSON som det första argumentet när vi anropar funktionen, följt av sökvägen till värdet som ska ersättas, följt av värdet som ska ersättas.

Vi kan även byta ut flera nyckel/värdepar om det behövs.

Syntax

Det fungerar så här:

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

Där json representerar den ursprungliga JSON, och path1, value1, path2, value2... är sökväg/värdepar som ska ersättas.

Exempel

Här är ett grundläggande exempel att visa:

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

Resultat:

{"name":"Baldy"}

Här uppdaterade jag värdet på name nyckel från Fluffy till Baldy .

Vi kan uppdatera flera nyckel/värdepar så här:

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

Resultat:

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

Jag lade helt enkelt till fler nyckel-/värdeargument när jag anropade json_replace() .

Här använde jag radbrytningar för att göra koden lättare att läsa. Allt kunde ha varit på en rad – resultatet skulle ha blivit detsamma.

Vad händer om nyckeln inte finns?

Om nyckeln inte redan finns i JSON, ersätts ingenting:

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

Resultat:

{"name":"Fluffy"}

Detta är den huvudsakliga egenskapen som särskiljer json_replace() funktion från json_set() och json_insert() funktioner. Dessa funktioner kommer att infoga värdet om nyckeln inte redan finns.

Det är dock möjligt att effektivt infoga nya nycklar med json_replace() genom att ersätta hela JSON-objektet/dokumentet. Exempel nedan.

Ersätt hela JSON-dokumentet

Vi kan använda json_replace() för att ersätta hela JSON-dokumentet med ett annat:

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

Resultat:

{"name":"Baldy"}

Så detta gör det möjligt för oss att effektivt infoga nya nycklar i dokumentet:

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

Resultat:

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

Strängt taget satte vi inte in några nya nycklar. Vi bytte helt enkelt ut hela dokumentet. Men resultatet blev ett JSON-dokument som innehåller nycklar som det ursprungliga inte innehöll.

Ersätt ett inbäddat objekt

Vi kan även ersätta inbäddade objekt:

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

Resultat:

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

När jag gjorde detta använde jag json() funktion för att returnera mitt argument som en JSON-sträng. Det här är vad som händer när jag inte gör det:

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

Resultat:

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

JSON-dokumentet infogas som ett textvärde istället för ett JSON-objekt, och dess dubbla citattecken escapes därför med omvänt snedstreck.

Vi kan dock inte bara ta bort de enskilda citattecken, eftersom detta resulterar i ett fel:

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

Resultat:

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

Utan enkla citattecken eller json() funktion, får vi ett fel så fort den stöter på det vänstra lockiga hängslet. Vi behöver därför använda enkla citattecken eller json() funktion, beroende på om vi infogar ett JSON-objekt eller ett SQL-sträng/textvärde.

Ett annat sätt att infoga ett JSON-objekt är att använda json_object() funktion istället för json() funktion:

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

Resultat:

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

Ersätt en array

Samma koncept gäller med arrayer:

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

Resultat:

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

Om vi ​​tar bort json() funktion får vi detta:

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

Resultat:

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

Och om vi tar bort de enskilda citattecken får vi ett felmeddelande:

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 använda json_array() funktion istället för json() . Den funktionen låter dig skapa en array baserat på dess argument:

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

Resultat:

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

Lägg till värden i slutet av en array

För att lägga till värden i slutet av en array kan vi använda antingen json_insert() eller json_set() funktioner.

Men om vi måste använda json_replace() , vi kan ersätta hela arrayen med en annan som har extravärdet/erna lagt till i slutet av arrayen:

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

Resultat:

[1,2,3,4]

Men som nämnt, json_insert() och json_set() låter dig faktiskt lägga till värden till arrayen utan att ersätta hela arrayen.

Ersätt matriselement

Här är ett exempel på hur du använder json_replace() för att ersätta ett element i en array:

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

Resultat:

[1,4,3]

Arrayer är nollbaserade, och så [1] indikerar det andra matrisobjektet.

json_set() funktion kan också användas för att ersätta befintliga element. Men json_insert() funktion tillåter oss inte att ersätta befintliga element.

Ogiltiga sökvägar

Vi får ett felmeddelande om vår väg inte är väl utformad:

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

Resultat:

Runtime error: JSON path error near 'a'

I det här fallet glömde jag att inkludera $. längst fram på stigen.

Ogiltiga JSON-dokument

Vi får också ett felmeddelande om att JSON inte är välformaterad:

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

Resultat:

Runtime error: malformed JSON

Den här gången säger felet att vår JSON är felaktig.


  1. (Android) Hitta sökvägen /Android i internminnet

  2. RODBC odbcDriverConnect() Anslutningsfel

  3. SQL Server AlwaysOn Availability Groups:Installation och konfiguration, del 1

  4. Hur simulerar man UNPIVOT i Access?