sql >> Databasteknik >  >> RDS >> SQLite

SQLite JSON_SET()

SQLite json_set() funktionen tillåter oss att infoga i eller ersätta ett värde i ett JSON-dokument.

Vi skickar den ursprungliga JSON som det första argumentet när vi anropar funktionen, följt av en sökväg som anger var det nya värdet ska infogas/ersättas, följt av värdet som ska infogas/ersättas.

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

Syntax

Det fungerar så här:

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

Där json representerar den ursprungliga JSON, och path1, value1, path2, value2... är sökväg/värdepar som vi kan använda för att infoga nya värden i JSON-dokumentet (eller ersätta, allt efter omständigheterna).

Exempel

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

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

Resultat:

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

Här infogade jag ett nytt nyckel/värdepar ("b":2 ) i JSON-dokumentet.

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

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

Resultat:

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

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

Ersätt värden

Om nyckeln redan finns ersätts dess värde med det nya värdet:

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

Resultat:

{"a":1,"b":3}

Detta är huvudskillnaden mellan json_set() och json_insert() . json_insert() funktionen kommer inte att infoga värdet om nyckeln redan finns.

Ett annat sätt att ersätta värden är att använda json_replace() .

Infoga ett objekt

Här är ett exempel på att infoga ett JSON-objekt:

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

Resultat:

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

I det här fallet 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_set('{ "a" : 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.

Att bara ta bort de enskilda citattecken resulterar dock i ett fel:

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

Resultat:

Parse error: unrecognized token: "{"
  SELECT json_set('{ "a" : 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 krulliga hängslet.

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

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

Resultat:

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

Infoga en array

Det är en liknande sak när du infogar arrayer:

SELECT json_set('{ "a" : 1 }', '$.b', json('[ 2, 3, 4 ]'));

Resultat:

{"a":1,"b":[2,3,4]}

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

SELECT json_set('{ "a" : 1 }', '$.b', '[ 2, 3, 4 ]');

Resultat:

{"a":1,"b":"[ 2, 3, 4 ]"}

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

SELECT json_set('{ "a" : 1 }', '$.b', [ 2, 3, 4 ]);

Resultat:

Parse error: no such column:  2, 3, 4 
  SELECT json_set('{ "a" : 1 }', '$.b', [ 2, 3, 4 ]);
                          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_set('{ "a" : 1 }', '$.b', json_array( 2, 3, 4 ) );

Resultat:

{"a":1,"b":[2,3,4]}

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

Vi kan använda json_set() för att lägga till värden i slutet av en matris.

För att göra detta, använd ett arrayindex av [#] :

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

Resultat:

[1,2,3,4]

Samma princip gäller för kapslade arrayer:

SELECT json_set('[ 1, [ "a", "b" ], 3 ]', '$[1][#]', "c" );

Resultat:

[1,["a","b","c"],3]

Ersätt matriselement

Vi kan använda json_set() för att ersätta element i arrayen:

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

Resultat:

[1,4,3]

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

json_replace() funktion kan också användas för att ersätta befintliga element. Återigen, detta skiljer sig från json_insert() , som inte ersätter befintliga element.

Ogiltiga sökvägar

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

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

Resultat:

Runtime error: JSON path error near 'b'

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_set('{ "a" : 1', '$.b', 2);

Resultat:

Runtime error: malformed JSON

Den här gången berättar felet att vår JSON är felaktig.


  1. MySQL-pivottabellsfråga med dynamiska kolumner

  2. Azure SQL Database Administration Tips and Hints Exam (DP-300)

  3. 2nd Quadrant på PostgresConf US 2018

  4. Ladda upp CSV-fil till SQL-server