MariaDB inkluderer to vælgere, der gør det muligt for os at vælge elementer fra JSON-arrays:
[N ]
vælger elementnummer N i arrayet (f.eks.[0]
for at vælge det første element).[*]
vælger alle elementer i arrayet.
Disse kan bruges i en række JSON-funktioner, der er inkluderet i MariaDB. Følgende eksempler bruger dem med JSON_EXTRACT()
funktion for at returnere valgte matrixelementer.
Eksempel – [N ]
Her er et simpelt eksempel til at demonstrere, hvordan man vælger et enkelt array-element:
SELECT JSON_EXTRACT('[1,2,3]', '$[1]');
Resultat:
+---------------------------------+ | JSON_EXTRACT('[1,2,3]', '$[1]') | +---------------------------------+ | 2 | +---------------------------------+
Arrays er nul-baserede, og derfor $[1]
vælger det andet array-element.
Her er et andet eksempel, denne gang ved hjælp af et lidt 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 dette tilfælde .sizes
angiver størrelserne
objektmedlem, og så $.sizes[1]
vælger det andet element i størrelserne
array.
Eksempel- [*]
Eksempel:
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 dette tilfælde ser resultatet nøjagtigt det samme ud som det oprindelige array, i hvilket tilfælde det kunne have været returneret blot ved at angive $.sizes
.
Multiple Array Selectors
Men her er et andet eksempel, der bruger to array-vælgere.
Først bruger vi et jokertegn til at vælge alle elementer i arrayet. Så bruger vi en anden matrixvælger til kun at vælge det andet element i en matrix, der er indlejret i disse elementer:
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"] | +-----------------------------------------------+
Wildcard-trin
Hvis dit JSON-dokument indeholder flere arrays med samme navn, nogle indlejret på forskellige niveauer eller i deres eget objekt, kan du vælge dem alle ved hjælp af jokertegntrinnet (**
). Jokertegntrinnet vælger rekursivt alle underordnede elementer af det aktuelle element.
Her bruger vi det til at hjælpe med at bygge et JSONPath-udtryk, der returnerer det andet array-element fra alle arrays kaldet sizes
, inklusive arrays, der er indlejret i andre dokumenter:
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"] | +-------------------------------------+