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

3 façons d'extraire une valeur d'un document JSON dans SQLite

Lors de l'utilisation de SQLite, nous pouvons utiliser les méthodes suivantes pour extraire des données d'un document JSON.

Le json_extract() Fonction

Comme son nom l'indique, le json_extract() la fonction extrait et renvoie une ou plusieurs valeurs à partir d'un JSON bien formé.

Exemple :

SELECT json_extract('{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}', 
'$.dogs[1]'
);

Résultat :

{"name":"Bark","scores":[3,4,8,7]}

Les tableaux sont basés sur zéro, et donc le décompte commence à 0 . Par conséquent, nous avons spécifié [1] pour obtenir le deuxième élément dans le dogs tableau, qui se trouve être un objet JSON.

Nous pouvons renvoyer uniquement le nom du chien à cette position dans le tableau en ajoutant à notre chemin :

SELECT json_extract('{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}', 
'$.dogs[1].name'
);

Résultat :

Bark

Nous pouvons utiliser json_extract() pour renvoyer plusieurs chemins :

SELECT json_extract('{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}', 
'$.dogs[0].name',
'$.dogs[1].name',
'$.dogs[2].name'
);

Résultat :

["Wag","Bark","Woof"]

Lorsque nous extrayons des valeurs de plusieurs chemins, les valeurs sont renvoyées dans un tableau.

Le -> Opérateur

Le -> extrait un sous-composant d'un document JSON et renvoie une représentation JSON de ce sous-composant.

Par conséquent, nous pouvons remplacer le premier exemple par ceci :

SELECT '{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}' -> '$.dogs[1]';

Résultat :

{"name":"Bark","scores":[3,4,8,7]}

Le -> L'opérateur est subtilement différent de json_extract() fonction :

  • Le -> L'opérateur renvoie toujours une représentation JSON du sous-composant.
  • Le json_extract() La fonction ne renvoie JSON que s'il existe deux arguments de chemin ou plus (car le résultat est alors un tableau JSON) ou si l'argument de chemin unique fait référence à un tableau ou à un objet.
  • S'il n'y a qu'un seul argument de chemin et que ce chemin fait référence à un null JSON ou à une chaîne ou à une valeur numérique, alors json_extract() renvoie la valeur SQL NULL, TEXT, INTEGER ou REAL correspondante.

Par conséquent, voici ce qui se passe lorsque nous extrayons le nom d'un chien de notre JSON :

SELECT '{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}' -> '$.dogs[1].name';

Résultat :

"Bark"

Cette fois, il est entouré de guillemets. C'est parce qu'il a renvoyé une représentation JSON de la valeur. Lorsque nous avons extrait la même valeur avec json_extract() auparavant, nous obtenions une représentation SQL de la valeur.

Cependant, nous pouvons également utiliser le ->> opérateur pour retourner une représentation SQL.

Le ->> Opérateur

Le ->> l'opérateur fonctionne de la même manière que le -> opérateur, sauf que ->> renvoie une représentation SQL du sous-composant spécifié. Plus précisément, il renvoie un SQL TEXT , INTEGER , REAL , ou NULL valeur qui représente le sous-composant sélectionné, ou NULL si le sous-composant n'existe pas.

Par conséquent, voici ce qui se passe lorsque nous utilisons le ->> opérateur pour extraire le nom du chien :

SELECT '{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}' ->> '$.dogs[1].name';

Résultat :

Bark

Il n'est plus entre guillemets.