MariaDB zawiera dwa selektory, które umożliwiają nam wybieranie elementów z tablic JSON:
[N]
wybiera numer elementu N w tablicy (na przykład[0]
aby wybrać pierwszy element).[*]
zaznacza wszystkie elementy w tablicy.
Można ich używać w wielu funkcjach JSON zawartych w MariaDB. Poniższe przykłady używają ich z JSON_EXTRACT()
funkcji w celu zwrócenia wybranych elementów tablicy.
Przykład – [N]
Oto prosty przykład pokazujący, jak wybrać pojedynczy element tablicy:
SELECT JSON_EXTRACT('[1,2,3]', '$[1]');
Wynik:
+---------------------------------+ | JSON_EXTRACT('[1,2,3]', '$[1]') | +---------------------------------+ | 2 | +---------------------------------+
Tablice są liczone od zera, więc $[1]
wybiera drugi element tablicy.
Oto kolejny przykład, tym razem z nieco większym dokumentem JSON:
SET @json = '
{
"_id": 1,
"product": "Left Handed Screwdriver",
"sizes": [ "S", "M", "L" ]
}
';
SELECT JSON_EXTRACT(@json, '$.sizes[1]');
Wynik:
+-----------------------------------+ | JSON_EXTRACT(@json, '$.sizes[1]') | +-----------------------------------+ | "M" | +-----------------------------------+
W tym przypadku .sizes
określa sizes
element członkowski obiektu, a więc $.sizes[1]
wybiera drugi element w sizes
tablica.
Przykład — [*]
[*]
selektor wybiera wszystkie elementy w tablicy.
Przykład:
SET @json = '
{
"_id": 1,
"product": "Left Handed Screwdriver",
"sizes": [ "S", "M", "L" ]
}
';
SELECT JSON_EXTRACT(@json, '$.sizes[*]');
Wynik:
+-----------------------------------+ | JSON_EXTRACT(@json, '$.sizes[*]') | +-----------------------------------+ | ["S", "M", "L"] | +-----------------------------------+
W tym przypadku wynik wygląda dokładnie tak samo, jak oryginalna tablica, w takim przypadku mógł zostać zwrócony przez samo określenie $.sizes
.
Selektory wielu tablic
Ale oto kolejny przykład, który używa dwóch selektorów tablicowych.
Najpierw używamy selektora symboli wieloznacznych, aby wybrać wszystkie elementy w tablicy. Następnie używamy innego selektora tablicy, aby wybrać tylko drugi element w tablicy, który jest zagnieżdżony w tych elementach:
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]');
Wynik:
+-----------------------------------------------+ | JSON_EXTRACT(@json, '$.products[*].sizes[1]') | +-----------------------------------------------+ | ["M", 7, "Grande"] | +-----------------------------------------------+
Krok z symbolami wieloznacznymi
Jeśli Twój dokument JSON zawiera wiele tablic o tej samej nazwie, niektóre zagnieżdżone na różnych poziomach lub we własnym obiekcie, możesz wybrać je wszystkie za pomocą kroku z symbolem wieloznacznym (**
). Krok z symbolem wieloznacznym rekursywnie wybiera wszystkie elementy podrzędne bieżącego elementu.
Tutaj używamy go do tworzenia wyrażenia JSONPath, które zwraca drugi element tablicy ze wszystkich tablic o nazwie sizes
, w tym tablice zagnieżdżone w innych dokumentach:
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]');
Wynik:
+-------------------------------------+ | JSON_EXTRACT(@json, '$**.sizes[1]') | +-------------------------------------+ | ["M", "Narrow", "Medium"] | +-------------------------------------+