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"] | +-------------------------------------+