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

Opérateur

Dans SQLite, le ->> L'opérateur extrait un sous-composant d'un document JSON et renvoie une représentation SQL de ce sous-composant.

Le ->> L'opérateur a été introduit pour la première fois dans la version 3.38.0 de SQLite (publiée le 22 février 2022).

Syntaxe

La syntaxe ressemble à ceci :

json ->> path

json est le document JSON et le path est le chemin vers le sous-composant que nous voulons en extraire.

Nous fournissons donc un document JSON à gauche de l'opérateur, et nous spécifions le chemin que nous voulons extraire à sa droite.

Le ->> L'opérateur renvoie toujours une représentation SQL du sous-composant spécifié. Pour renvoyer une représentation JSON, utilisez le -> opérateur à la place.

Exemples

Voici un exemple simple pour montrer comment le ->> l'opérateur fonctionne :

SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$';

Résultat :

{"name":"Wag","type":"Dog"}

Dans ce cas, j'ai spécifié un chemin de '$' qui renvoie le document entier.

Spécifiez un autre chemin :

SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.type';

Résultat :

Dog

Nous pouvons également omettre le signe dollar et le point, comme ceci :

SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> 'type';

Résultat :

Dog

Le voici avec un document JSON plus volumineux :

SELECT '[
        { 
        "user" : "Spike",
        "age" : 30,
        "scores" : [ 9, 7, 3 ]
        },
        { 
        "user" : "Faye",
        "age" : 25,
        "scores" : [ 90, 87, 93 ]
        },
        { 
        "user" : "Jet",
        "age" : 40,
        "scores" : [ 50, 38, 67 ]
        }
        ]' ->> '$[0]';

Résultat :

{"user":"Spike","age":30,"scores":[9,7,3]}

Dans SQLite, les tableaux sont basés sur zéro, et donc en spécifiant [0] renvoie le premier élément du tableau.

Si nous voulions uniquement obtenir les scores de cet utilisateur, nous pourrions procéder comme suit :

SELECT '[
        { 
        "user" : "Spike",
        "age" : 30,
        "scores" : [ 9, 7, 3 ]
        },
        { 
        "user" : "Faye",
        "age" : 25,
        "scores" : [ 90, 87, 93 ]
        },
        { 
        "user" : "Jet",
        "age" : 40,
        "scores" : [ 50, 38, 67 ]
        }
        ]' ->> '$[0].scores';

Résultat :

[9,7,3]

Nous pouvons aller encore plus loin et extraire un score spécifique :

SELECT '[
        { 
        "user" : "Spike",
        "age" : 30,
        "scores" : [ 9, 7, 3 ]
        },
        { 
        "user" : "Faye",
        "age" : 25,
        "scores" : [ 90, 87, 93 ]
        },
        { 
        "user" : "Jet",
        "age" : 40,
        "scores" : [ 50, 38, 67 ]
        }
        ]' ->> '$[0].scores[1]';

Résultat :

7

Chemin inexistant

Si le chemin n'existe pas dans le JSON, une valeur nulle est renvoyée :

SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.age';

Résultat :

null

Notez que dans SQLite, vous pouvez utiliser .nullvalue pour spécifier une chaîne à afficher chaque fois qu'une valeur nulle est renvoyée. Dans mon cas, j'avais précédemment exécuté la commande suivante :

.nullvalue null

Cela précise que le texte null doit être affiché chaque fois qu'une valeur nulle est renvoyée. C'est pourquoi l'exemple ci-dessus affiche le texte null . Si je ne l'avais pas fait, le résultat aurait pu être vide.

JSON non valide

Si le premier argument n'est pas un JSON valide, une erreur est renvoyée :

SELECT '{ "name" }' ->> '$';

Résultat :

Runtime error: malformed JSON

Chemin invalide

Et si le deuxième argument n'est pas un chemin valide, une erreur est renvoyée :

SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$name';

Résultat :

Runtime error: JSON path error near 'name'

Dans ce cas, j'ai oublié d'inclure le point (. ) entre le signe dollar ($ ) et name .

Cependant, comme mentionné, il est possible d'omettre complètement le signe dollar et le point :

SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> 'name';

Résultat :

Wag