MariaDB obsahuje dva selektory, které nám umožňují vybrat prvky z polí JSON:
[N]
vybere číslo prvku N v poli (například[0]
pro výběr prvního prvku).[*]
vybere všechny prvky v poli.
Ty lze použít v řadě funkcí JSON, které jsou součástí MariaDB. Následující příklady je používají s JSON_EXTRACT()
funkce, aby se vrátily vybrané prvky pole.
Příklad – [N]
Zde je jednoduchý příklad, který demonstruje, jak vybrat jeden prvek pole:
SELECT JSON_EXTRACT('[1,2,3]', '$[1]');
Výsledek:
+---------------------------------+ | JSON_EXTRACT('[1,2,3]', '$[1]') | +---------------------------------+ | 2 | +---------------------------------+
Pole jsou založeny na nule, a tak $[1]
vybere druhý prvek pole.
Zde je další příklad, tentokrát s použitím trochu většího dokumentu JSON:
SET @json = '
{
"_id": 1,
"product": "Left Handed Screwdriver",
"sizes": [ "S", "M", "L" ]
}
';
SELECT JSON_EXTRACT(@json, '$.sizes[1]');
Výsledek:
+-----------------------------------+ | JSON_EXTRACT(@json, '$.sizes[1]') | +-----------------------------------+ | "M" | +-----------------------------------+
V tomto případě .sizes
určuje sizes
člen objektu, a tak $.sizes[1]
vybere druhou položku v sizes
pole.
Příklad- [*]
[*]
selektor vybere všechny prvky v poli.
Příklad:
SET @json = '
{
"_id": 1,
"product": "Left Handed Screwdriver",
"sizes": [ "S", "M", "L" ]
}
';
SELECT JSON_EXTRACT(@json, '$.sizes[*]');
Výsledek:
+-----------------------------------+ | JSON_EXTRACT(@json, '$.sizes[*]') | +-----------------------------------+ | ["S", "M", "L"] | +-----------------------------------+
V tomto případě výsledek vypadá úplně stejně jako původní pole, v takovém případě mohl být vrácen pouze zadáním $.sizes
.
Vícenásobné selektory pole
Ale tady je další příklad, který používá dva selektory pole.
Nejprve použijeme selektor zástupných znaků k výběru všech prvků v poli. Potom použijeme další selektor pole k výběru pouze druhého prvku v poli, které je vnořeno do těchto prvků:
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]');
Výsledek:
+-----------------------------------------------+ | JSON_EXTRACT(@json, '$.products[*].sizes[1]') | +-----------------------------------------------+ | ["M", 7, "Grande"] | +-----------------------------------------------+
Krok se zástupnými znaky
Pokud váš dokument JSON obsahuje více polí se stejným názvem, z nichž některá jsou vnořena na různých úrovních nebo ve vlastním objektu, můžete je všechna vybrat pomocí kroku se zástupnými znaky (**
). Krok zástupných znaků rekurzivně vybere všechny podřízené prvky aktuálního prvku.
Zde jej používáme k vytvoření výrazu JSONPath, který vrací druhý prvek pole ze všech polí s názvem sizes
, včetně polí, která jsou vnořena do jiných 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]');
Výsledek:
+-------------------------------------+ | JSON_EXTRACT(@json, '$**.sizes[1]') | +-------------------------------------+ | ["M", "Narrow", "Medium"] | +-------------------------------------+