När du arbetar med JSON i MariaDB kan du använda JSONPath-uttryck för att manipulera data i ett JSON-dokument.
En kraftfull funktion som MariaDB tillhandahåller är jokerteckensteget (**
). Detta låter dig välja rekursivt alla underordnade element till det aktuella elementet.
Jokerteckensteget är ett icke-standardiserat tillägg, och det stöds också med samma betydelse i MySQL.
Exempel
Här är ett exempel att visa:
SET @json = '[
{ "name" : "Wag", "type" : "Dog" },
{ "name" : "Bark", "type" : "Dog" },
{ "name" : "Meow", "type" : "Cat" },
{ "name" : "Scratch", "type" : "Cat" }
]';
SELECT JSON_EXTRACT(@json, '$**.name');
Resultat:
+------------------------------------+ | JSON_EXTRACT(@json, '$**.name') | +------------------------------------+ | ["Wag", "Bark", "Meow", "Scratch"] | +------------------------------------+
Jokerteckensteget gick igenom alla objekt och valde värdena från deras name
medlemmar.
I det här fallet kunde vi ha uppnått samma resultat med en annan väljare. Array-jokerteckenväljaren skulle ha hjälpt oss att få samma resultat:
SET @json = '[
{ "name" : "Wag", "type" : "Dog" },
{ "name" : "Bark", "type" : "Dog" },
{ "name" : "Meow", "type" : "Cat" },
{ "name" : "Scratch", "type" : "Cat" }
]';
SELECT JSON_EXTRACT(@json, '$[*].name');
Resultat:
+------------------------------------+ | JSON_EXTRACT(@json, '$[*].name') | +------------------------------------+ | ["Wag", "Bark", "Meow", "Scratch"] | +------------------------------------+
Samma resultat.
Men saker och ting förändras om vi använder ett annat dokument.
Exempel 2
I följande exempel får vi ett annat resultat mellan jokerteckensteget och arrayväljaren:
SET @json = '[
{
"name" : "Homer",
"pets" : [
{
"name" : "Wag",
"type" : "Dog"
},
{
"name" : "Scratch",
"type" : "Cat"
}
]
}
]';
SELECT
JSON_EXTRACT(@json, '$**.name'),
JSON_EXTRACT(@json, '$[*].name');
Resultat:
+---------------------------------+----------------------------------+ | JSON_EXTRACT(@json, '$**.name') | JSON_EXTRACT(@json, '$[*].name') | +---------------------------------+----------------------------------+ | ["Homer", "Wag", "Scratch"] | ["Homer"] | +---------------------------------+----------------------------------+
Annat resultat.
Resultaten kommer uppenbarligen att bero på dokumentet och den faktiska konstruktionen av JSONPath-uttrycket, och de väljare som används beror på dina krav.
En sak att komma ihåg är att jokerteckensteget inte får vara det sista steget i JSONPath-uttrycket. Det måste följas av ett array- eller objektmedlemsväljarsteg.
Exempel 3
Här är ett exempel som returnerar det andra arrayelementet från alla arrayer som kallas sizes
, inklusive matriser som är kapslade i andra dokument:
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]');
Resultat:
+-------------------------------------+ | JSON_EXTRACT(@json, '$**.sizes[1]') | +-------------------------------------+ | ["M", "Narrow", "Medium"] | +-------------------------------------+
Arrayer är nollbaserade och så $**.sizes[1]
hänvisar till det andra elementet i alla sizes
arrayer.