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
Où 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