SQLite
 sql >> Base de données >  >> RDS >> SQLite

SQLite JSON_INSERT()

Le SQLite json_insert() permet d'insérer une nouvelle valeur dans un document JSON.

Nous passons le JSON d'origine comme premier argument lorsque nous appelons la fonction, suivi d'un chemin qui spécifie où insérer la nouvelle valeur, suivi de la valeur à insérer.

Nous pouvons également insérer plusieurs paires clé/valeur si nécessaire.

Syntaxe

La fonction s'appelle ainsi :

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

json représente le JSON d'origine, et path1, value1, path2, value2... sont des paires chemin/valeur que nous pouvons utiliser pour insérer de nouvelles valeurs dans le document JSON.

Exemple

Voici un exemple de base pour illustrer :

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

Résultat :

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

Ici, j'ai inséré une nouvelle paire clé/valeur ("b":2 ) dans le document JSON.

Nous pouvons insérer plusieurs paires clé/valeur comme ceci :

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

Résultat :

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

J'ai simplement ajouté plus d'arguments clé/valeur lorsque j'ai appelé json_insert() .

La clé/valeur existe déjà ?

Le json_insert() la fonction n'insérera pas la valeur si la clé existe déjà :

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

Résultat :

{"a":1}

Dans ce cas, la clé a existe déjà dans le JSON, et donc essayer d'insérer une nouvelle valeur pour cette clé ne fonctionne pas.

Pour remplacer une valeur, utilisez soit json_replace() ou json_set() .

Insérer un objet

Voici un exemple d'insertion d'un autre document JSON :

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

Résultat :

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

Dans ce cas, j'ai utilisé le json() fonction pour renvoyer mon argument sous forme de chaîne JSON. Voici ce qui se passe lorsque je ne le fais pas :

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

Résultat :

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

Le document JSON est inséré en tant que valeur texte au lieu d'un objet JSON, et ses guillemets doubles sont donc échappés avec des barres obliques inverses.

C'est assez juste cependant. Après tout, nous avons mis la nouvelle valeur entre guillemets simples. Comment SQLite savait-il si nous voulions insérer une chaîne ou un objet JSON ?

Et ce n'est pas comme si nous pouvions simplement supprimer ces guillemets simples :

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

Résultat :

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

Sans guillemets simples ni json() fonction, nous obtenons une erreur dès qu'elle rencontre l'accolade gauche.

Une autre façon d'insérer un objet JSON est d'utiliser le json_object() fonction au lieu de json() fonction :

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

Résultat :

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

Insérer un tableau

C'est la même chose lors de l'insertion de tableaux :

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

Résultat :

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

Si nous supprimons le json() fonction, nous obtenons ceci :

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

Résultat :

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

Et si nous supprimons les guillemets simples, nous obtenons une erreur :

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

Résultat :

Parse error: no such column:  2, 3, 4 
  SELECT json_insert('{ "a" : 1 }', '$.b', [ 2, 3, 4 ]);
                             error here ---^

Nous pouvons également utiliser le json_array() fonction au lieu de json() . Cette fonction vous permet de créer un tableau basé sur ses arguments :

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

Résultat :

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

Ajouter des valeurs à la fin d'un tableau

Nous pouvons utiliser json_insert() pour ajouter des valeurs à la fin d'un tableau.

Pour ce faire, utilisez un index de tableau de [#] :

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

Résultat :

[1,2,3,4]

Le même principe s'applique aux tableaux imbriqués :

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

Résultat :

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

Chemins non valides

Nous aurons une erreur si notre chemin n'est pas bien formé :

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

Résultat :

Runtime error: JSON path error near 'b'

Dans ce cas, j'ai oublié d'inclure $. au début du chemin.

Documents JSON non valides

Nous aurons également une erreur, le JSON n'est pas bien formé :

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

Résultat :

Runtime error: malformed JSON

Cette fois, l'erreur nous indique que notre JSON est malformé.