MariaDB innehåller två väljare som gör det möjligt för oss att välja element från JSON-arrayer:
[N]
väljer elementnummer N i arrayen (till exempel[0]
för att välja det första elementet).[*]
väljer alla element i arrayen.
Dessa kan användas i ett antal JSON-funktioner som ingår i MariaDB. Följande exempel använder dem med JSON_EXTRACT()
funktion för att returnera valda arrayelement.
Exempel – [N]
Här är ett enkelt exempel för att visa hur man väljer ett enstaka arrayelement:
SELECT JSON_EXTRACT('[1,2,3]', '$[1]');
Resultat:
+---------------------------------+ | JSON_EXTRACT('[1,2,3]', '$[1]') | +---------------------------------+ | 2 | +---------------------------------+
Arrayer är nollbaserade, och så $[1]
väljer det andra matriselementet.
Här är ett annat exempel, den här gången med ett lite större JSON-dokument:
SET @json = '
{
"_id": 1,
"product": "Left Handed Screwdriver",
"sizes": [ "S", "M", "L" ]
}
';
SELECT JSON_EXTRACT(@json, '$.sizes[1]');
Resultat:
+-----------------------------------+ | JSON_EXTRACT(@json, '$.sizes[1]') | +-----------------------------------+ | "M" | +-----------------------------------+
I det här fallet, .sizes
anger sizes
objektmedlem, och så $.sizes[1]
väljer det andra objektet i sizes
array.
Exempel- [*]
[*]
selector väljer alla element i arrayen.
Exempel:
SET @json = '
{
"_id": 1,
"product": "Left Handed Screwdriver",
"sizes": [ "S", "M", "L" ]
}
';
SELECT JSON_EXTRACT(@json, '$.sizes[*]');
Resultat:
+-----------------------------------+ | JSON_EXTRACT(@json, '$.sizes[*]') | +-----------------------------------+ | ["S", "M", "L"] | +-----------------------------------+
I det här fallet ser resultatet exakt likadant ut som den ursprungliga arrayen, i så fall kunde det ha returnerats bara genom att ange $.sizes
.
Flera matrisväljare
Men här är ett annat exempel som använder två arrayväljare.
Först använder vi en jokerteckenväljare för att välja alla element i arrayen. Sedan använder vi en annan arrayväljare för att bara välja det andra elementet i en array som är kapslad i dessa element:
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]');
Resultat:
+-----------------------------------------------+ | JSON_EXTRACT(@json, '$.products[*].sizes[1]') | +-----------------------------------------------+ | ["M", 7, "Grande"] | +-----------------------------------------------+
Jokerteckensteg
Om ditt JSON-dokument innehåller flera arrayer med samma namn, några kapslade på olika nivåer eller i sitt eget objekt, kan du välja dem alla med hjälp av jokerteckensteget (**
). Jokerteckensteget väljer rekursivt alla underordnade element i det aktuella elementet.
Här använder vi det för att bygga ett JSONPath-uttryck 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"] | +-------------------------------------+