MariaDB inclut deux sélecteurs qui nous permettent de sélectionner des éléments dans des tableaux JSON :
[N]
sélectionne l'élément numéro N dans le tableau (par exemple,[0]
pour sélectionner le premier élément).[*]
sélectionne tous les éléments du tableau.
Ceux-ci peuvent être utilisés dans un certain nombre de fonctions JSON incluses dans MariaDB. Les exemples suivants les utilisent avec le JSON_EXTRACT()
fonction afin de renvoyer les éléments de tableau sélectionnés.
Exemple :[N]
Voici un exemple simple pour montrer comment sélectionner un seul élément de tableau :
SELECT JSON_EXTRACT('[1,2,3]', '$[1]');
Résultat :
+---------------------------------+ | JSON_EXTRACT('[1,2,3]', '$[1]') | +---------------------------------+ | 2 | +---------------------------------+
Les tableaux sont basés sur zéro, et donc $[1]
sélectionne le deuxième élément du tableau.
Voici un autre exemple, utilisant cette fois un document JSON légèrement plus grand :
SET @json = '
{
"_id": 1,
"product": "Left Handed Screwdriver",
"sizes": [ "S", "M", "L" ]
}
';
SELECT JSON_EXTRACT(@json, '$.sizes[1]');
Résultat :
+-----------------------------------+ | JSON_EXTRACT(@json, '$.sizes[1]') | +-----------------------------------+ | "M" | +-----------------------------------+
Dans ce cas, .sizes
spécifie les sizes
membre de l'objet, et donc $.sizes[1]
sélectionne le deuxième article dans les sizes
tableau.
Exemple :[*]
Le [*]
selector sélectionne tous les éléments du tableau.
Exemple :
SET @json = '
{
"_id": 1,
"product": "Left Handed Screwdriver",
"sizes": [ "S", "M", "L" ]
}
';
SELECT JSON_EXTRACT(@json, '$.sizes[*]');
Résultat :
+-----------------------------------+ | JSON_EXTRACT(@json, '$.sizes[*]') | +-----------------------------------+ | ["S", "M", "L"] | +-----------------------------------+
Dans ce cas, le résultat ressemble exactement au tableau d'origine, auquel cas il aurait pu être renvoyé simplement en spécifiant $.sizes
.
Sélecteur de tableaux multiples
Mais voici un autre exemple qui utilise deux sélecteurs de tableau.
Tout d'abord, nous utilisons un sélecteur générique pour sélectionner tous les éléments du tableau. Ensuite, nous utilisons un autre sélecteur de tableau pour sélectionner uniquement le deuxième élément d'un tableau imbriqué dans ces éléments :
SET @json = '
{
"products" :
[
{
"_id": 1,
"product": "Left Handed Screwdriver",
"sizes": [ "S", "M", "L" ]
},
{
"_id": 2,
"product": "Long Weight",
"sizes": [ 8, 7, 10 ]
},
{
"_id": 3,
"product": "Bottomless Coffee Cup",
"sizes": [ "Tall", "Grande", "Venti" ]
}
]
}
';
SELECT JSON_EXTRACT(@json, '$.products[*].sizes[1]');
Résultat :
+-----------------------------------------------+ | JSON_EXTRACT(@json, '$.products[*].sizes[1]') | +-----------------------------------------------+ | ["M", 7, "Grande"] | +-----------------------------------------------+
Étape générique
Si votre document JSON contient plusieurs tableaux portant le même nom, certains imbriqués à différents niveaux ou dans leur propre objet, vous pouvez tous les sélectionner à l'aide de l'étape générique (**
). L'étape générique sélectionne de manière récursive tous les éléments enfants de l'élément actuel.
Ici, nous l'utilisons pour créer une expression JSONPath qui renvoie le deuxième élément de tableau de tous les tableaux appelés sizes
, y compris les tableaux imbriqués dans d'autres documents :
SET @json = '[
{
"_id": 1,
"product": {
"name" : "Tuxedo",
"color" : "Blue",
"sizes": [ "S", "M", "L" ],
"accessories" : {
"belt" : {
"color" : "Navy",
"sizes" : [ "Wide", "Narrow" ]
},
"tie" : {
"color" : "Black",
"sizes" : [ "Short", "Medium", "Long" ]
}
}
}
}
]';
SELECT JSON_EXTRACT(@json, '$**.sizes[1]');
Résultat :
+-------------------------------------+ | JSON_EXTRACT(@json, '$**.sizes[1]') | +-------------------------------------+ | ["M", "Narrow", "Medium"] | +-------------------------------------+