Při práci s JSON v MariaDB můžete použít výrazy JSONPath k manipulaci s daty v dokumentu JSON.
Jednou z výkonných funkcí, kterou MariaDB poskytuje, je krok se zástupným znakem (**
). To vám umožňuje rekurzivně vybrat všechny podřízené prvky aktuálního prvku.
Zástupný znak je nestandardní rozšíření a je také podporováno se stejným významem v MySQL.
Příklad
Zde je příklad k demonstraci:
SET @json = '[
{ "name" : "Wag", "type" : "Dog" },
{ "name" : "Bark", "type" : "Dog" },
{ "name" : "Meow", "type" : "Cat" },
{ "name" : "Scratch", "type" : "Cat" }
]';
SELECT JSON_EXTRACT(@json, '$**.name');
Výsledek:
+------------------------------------+ | JSON_EXTRACT(@json, '$**.name') | +------------------------------------+ | ["Wag", "Bark", "Meow", "Scratch"] | +------------------------------------+
Krok zástupných znaků prošel všechny objekty a vybral hodnoty z jejich name
členů.
V tomto případě jsme stejného výsledku mohli dosáhnout s jiným selektorem. Selektor zástupných znaků pole by nám pomohl získat stejný výsledek:
SET @json = '[
{ "name" : "Wag", "type" : "Dog" },
{ "name" : "Bark", "type" : "Dog" },
{ "name" : "Meow", "type" : "Cat" },
{ "name" : "Scratch", "type" : "Cat" }
]';
SELECT JSON_EXTRACT(@json, '$[*].name');
Výsledek:
+------------------------------------+ | JSON_EXTRACT(@json, '$[*].name') | +------------------------------------+ | ["Wag", "Bark", "Meow", "Scratch"] | +------------------------------------+
Stejný výsledek.
Věci se však změní, pokud použijeme jiný dokument.
Příklad 2
V následujícím příkladu získáme jiný výsledek mezi krokem zástupného znaku a selektorem pole:
SET @json = '[
{
"name" : "Homer",
"pets" : [
{
"name" : "Wag",
"type" : "Dog"
},
{
"name" : "Scratch",
"type" : "Cat"
}
]
}
]';
SELECT
JSON_EXTRACT(@json, '$**.name'),
JSON_EXTRACT(@json, '$[*].name');
Výsledek:
+---------------------------------+----------------------------------+ | JSON_EXTRACT(@json, '$**.name') | JSON_EXTRACT(@json, '$[*].name') | +---------------------------------+----------------------------------+ | ["Homer", "Wag", "Scratch"] | ["Homer"] | +---------------------------------+----------------------------------+
Jiný výsledek.
Výsledky budou samozřejmě záviset na dokumentu a skutečné konstrukci výrazu JSONPath a použité selektory budou záviset na vašich požadavcích.
Jedna věc, kterou je třeba si zapamatovat, je, že krok zástupného znaku nesmí být posledním krokem ve výrazu JSONPath. Musí následovat krok selektoru prvku pole nebo objektu.
Příklad 3
Zde je příklad, 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"] | +-------------------------------------+
Pole jsou založeny na nule, takže $**.sizes[1]
odkazuje na druhý prvek ve všech sizes
pole.