MariaDB enthält zwei Selektoren, mit denen wir Elemente aus JSON-Arrays auswählen können:
[N]
wählt die Elementnummer N aus im Array (zum Beispiel[0]
um das erste Element auszuwählen).[*]
wählt alle Elemente im Array aus.
Diese können in einer Reihe von JSON-Funktionen verwendet werden, die in MariaDB enthalten sind. Die folgenden Beispiele verwenden sie mit JSON_EXTRACT()
Funktion, um ausgewählte Array-Elemente zurückzugeben.
Beispiel – [N]
Hier ist ein einfaches Beispiel, um zu demonstrieren, wie man ein einzelnes Array-Element auswählt:
SELECT JSON_EXTRACT('[1,2,3]', '$[1]');
Ergebnis:
+---------------------------------+| JSON_EXTRACT('[1,2,3]', '$[1]') |+------------------------------------ ----+| 2 |+---------------------------------------------+
Arrays sind nullbasiert, also $[1]
wählt das zweite Array-Element aus.
Hier ist ein weiteres Beispiel, diesmal mit einem etwas größeren JSON-Dokument:
SET @json = '
{
"_id": 1,
"product": "Left Handed Screwdriver",
"sizes": [ "S", "M", "L" ]
}
';
SELECT JSON_EXTRACT(@json, '$.sizes[1]');
Ergebnis:
+-----------------------------------+| JSON_EXTRACT(@json, '$.sizes[1]') |+----------------------------------------------- -+| "M" |+-----------------------------------+
In diesem Fall .sizes
gibt die sizes
an Objektmitglied, und so $.sizes[1]
wählt das zweite Element in den sizes
aus Array.
Beispiel- [*]
Der [*]
Selektor wählt alle Elemente im Array aus.
Beispiel:
SET @json = '
{
"_id": 1,
"product": "Left Handed Screwdriver",
"sizes": [ "S", "M", "L" ]
}
';
SELECT JSON_EXTRACT(@json, '$.sizes[*]');
Ergebnis:
+-----------------------------------+| JSON_EXTRACT(@json, '$.sizes[*]') |+----------------------------------------------- -+| ["S", "M", "L"] |+----------------------------------- +
In diesem Fall sieht das Ergebnis genauso aus wie das ursprüngliche Array, in diesem Fall hätte es einfach durch Angabe von $.sizes
zurückgegeben werden können .
Mehrere Array-Selektoren
Aber hier ist ein weiteres Beispiel, das zwei Array-Selektoren verwendet.
Zuerst verwenden wir einen Wildcard-Selektor, um alle Elemente im Array auszuwählen. Dann verwenden wir einen anderen Array-Selektor, um nur das zweite Element in einem Array auszuwählen, das in diesen Elementen verschachtelt ist:
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]');
Ergebnis:
Platzhalterschritt
Wenn Ihr JSON-Dokument mehrere Arrays mit demselben Namen enthält, von denen einige auf verschiedenen Ebenen oder in einem eigenen Objekt verschachtelt sind, können Sie sie alle mit Hilfe des Platzhalterschritts (**
). Der Platzhalterschritt wählt rekursiv alle untergeordneten Elemente des aktuellen Elements aus.
Hier verwenden wir es, um beim Erstellen eines JSONPath-Ausdrucks zu helfen, der das zweite Array-Element aus allen Arrays namens sizes
zurückgibt , einschließlich Arrays, die in anderen Dokumenten verschachtelt sind:
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]');
Ergebnis:
+-------------------------------------+| JSON_EXTRACT(@json, '$**.sizes[1]') |+------------------------------- -----+| ["M", "Schmal", "Mittel"] |+----------------------------------- --+