sql >> Databasteknik >  >> RDS >> SQLite

SQLite JSON_INSERT()

SQLite json_insert() funktionen låter oss infoga ett nytt 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, följt av värdet som ska infogas.

Vi kan också infoga flera nyckel/värdepar om det behövs.

Syntax

Funktionen heter så här:

json_extract(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.

Exempel

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

SELECT json_insert('{ "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_insert('{ "a" : 1 }', '$.b', 2, '$.c', 3 );

Resultat:

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

Jag lade helt enkelt till fler nyckel/värde-argument när jag anropade json_insert() .

Nyckel/värde finns redan?

json_insert() funktionen kommer inte att infoga värdet om nyckeln redan finns:

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

Resultat:

{"a":1}

I det här fallet, nyckeln a finns redan i JSON, så att försöka infoga ett nytt värde för den nyckeln fungerar inte.

För att ersätta ett värde, använd antingen json_replace() eller json_set() .

Infoga ett objekt

Här är ett exempel på hur du infogar ett annat JSON-dokument:

SELECT json_insert('{ "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_insert('{ "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.

Detta är rättvist dock. När allt kommer omkring lade vi det nya värdet i enstaka citattecken. Hur kunde SQLite veta om vi ville infoga en sträng eller ett JSON-objekt?

Och det är inte som om vi helt enkelt kan ta bort dessa enstaka citat:

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

Resultat:

Parse error: unrecognized token: "{"
  SELECT json_insert('{ "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_insert('{ "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_insert('{ "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_insert('{ "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_insert('{ "a" : 1 }', '$.b', [ 2, 3, 4 ]);

Resultat:

Parse error: no such column:  2, 3, 4 
  SELECT json_insert('{ "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_insert('{ "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_insert() 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_insert('[ 1, 2, 3 ]', '$[#]', 4 );

Resultat:

[1,2,3,4]

Samma princip gäller för kapslade arrayer:

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

Resultat:

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

Ogiltiga sökvägar

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

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

Resultat:

Runtime error: malformed JSON

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


  1. SQL mellan operatörer

  2. Kan vi omfördela Oracle tools.jar?

  3. Laravel 5 PDOException kunde inte hitta drivrutinen

  4. Hur lägger jag till egenskapen identitet till en befintlig kolumn i SQL Server