V MariaDB, JSON_SEARCH()
je vestavěná funkce, která vám umožňuje získat cestu k dané hodnotě v dokumentu JSON.
Přijímá dokument JSON a řetězec jako argumenty a vrací cestu k danému řetězci v dokumentu.
Syntaxe
Syntaxe vypadá takto:
JSON_SEARCH(
json_doc,
return_arg,
search_str[, escape_char[, path] ...]
)
Kde:
json_doc
je dokument JSON asearch_str
je řetězec.return_arg
je klíčové slovoone
neboall
. Pokud použijeteone
, vrátí se pouze první cesta. Všechny ostatní výskyty jsou ignorovány. Která cesta je považována za „první“ není definováno (podle dokumentace MariaDB). Pokudall
je zadáno, jsou vráceny cesty všech výskytů. Pokud existuje více cest, jsou automaticky zabaleny jako pole.escape_char
argument je volitelný znak, který lze použít jako znak escape.path
argument je volitelný argument, který určuje, kde začíná cesta „nejvyšší úrovně“ v dokumentu JSON.
Příklad
Zde je příklad k demonstraci:
SET @json = '
{
"name" : "Wag",
"type" : "Dog"
}';
SELECT JSON_SEARCH(@json, 'one', 'Wag');
Výsledek:
+----------------------------------+| JSON_SEARCH(@json, 'one', 'Wag') |+----------------------------------+ | "$.name" |+----------------------------------+
Zde je příklad vrácení cesty pro prvek v poli:
SET @json = '
{
"product" : "Left Handed Screwdriver",
"sizes" : [ "Small", "Medium", "Large" ],
}';
SELECT JSON_SEARCH(@json, 'one', 'Medium');
Výsledek:
+-------------------------------------+| JSON_SEARCH(@json, 'jeden', "střední") |+----------------------------------- --+| "$.sizes[1]" |+-------------------------------------+Pole jsou založeny na nule, a proto
$.sizes[1]
odkazuje na druhý prvek v poli.Více výskytů
Pokud chcete vrátit všechny cesty, které obsahují řetězec, použijte
all
místoone
pro druhý argument.SET @json = '[ { "name": "Wag", "type": "Dog", "weight": 20 }, { "name": "Bark", "type": "Dog", "weight": 10 }, { "name": "Meow", "type": "Cat", "weight": 7 } ]'; SELECT JSON_SEARCH(@json, 'all', 'Dog');
Výsledek:
+----------------------------------+| JSON_SEARCH(@json, 'all', "Pes") |+----------------------------------+ | ["$[0].type", "$[1].type"] |+------------------------------ -----+Pokud změníme
all
naone
, stane se toto:SET @json = '[ { "name": "Wag", "type": "Dog", "weight": 20 }, { "name": "Bark", "type": "Dog", "weight": 10 }, { "name": "Meow", "type": "Cat", "weight": 7 } ]'; SELECT JSON_SEARCH(@json, 'one', 'Dog');
Výsledek:
+----------------------------------+| JSON_SEARCH(@json, 'one', "Pes") |+----------------------------------+ | "$[0].type" |+----------------------------------+Je vrácena pouze jedna cesta.
Zadejte cestu
Zde je příklad, který určuje cestu, kterou chcete v dokumentu hledat:
SET @json = ' { "_id" : 1, "name" : "Wag", "details" : { "type" : "Dog", "weight" : 20, "awards" : { "NZ Dog Award" : "Top Dog", "New York Marathon" : "Fastest Animal", "Sumo 2021" : "Biggest Dog" } } } '; SELECT JSON_SEARCH( @json, 'all', '%dog%', NULL, '$.details.awards' ) AS Result;
Výsledek:
+---------------------------------------------- --------------------+| Výsledek |+----------------------------------------------- ------------------+| ["$.details.awards.NZ Dog Award", "$.details.awards.Sumo 2021"] |+------------------------ -----------------------------------------+V tomto případě řetězec
dog
ve skutečnosti se v dokumentu vyskytuje třikrát, ale pouze dvakrát pod zadanou cestou.Také jsme použili
NULL
pro argument znaku escape, což má za následek použití výchozího znaku escape, kterým je zpětné lomítko (\
).Výchozí únikový znak
Ve výchozím nastavení je znakem escape zpětné lomítko (
\
).Příklad:
SET @json = '[ { "uid": "Wag", "pwd": "my%pwd" }, { "uid": "Bark", "pwd": "my%%%pwd" }, { "uid": "Bark", "pwd": "myBIGpwd" } ]'; SELECT JSON_SEARCH(@json, 'all', 'my%pwd') AS "Not Escaped", JSON_SEARCH(@json, 'all', 'my\%pwd') AS "Escaped";
Výsledek:
+--------------------------------------+------- -----+| Neunikl | Utekl |+--------------------------------------+-------- ----+| ["$[0].pwd", "$[1].pwd", "$[2].pwd"] | "$[0].pwd" |+--------------------------------------+- -----------+Znak procenta (
%
) je zástupný znak, který odpovídá libovolnému počtu znaků. Pokud mu tedy neunikneme, bude odpovídat libovolnému počtu znaků, včetně znaků, které nejsou znakem procenta.Když však znak procenta escapujeme znakem escape, bude se shodovat pouze tehdy, když je na daném místě přesně jedno procento.
Výše uvedené výsledky to odrážejí.
Zadejte vlastní únikový znak
V případě potřeby můžete zadat vlastní znak escape. Chcete-li to provést, uveďte jej jako čtvrtý argument.
Příklad:
SET @json = '[ { "uid": "Wag", "pwd": "my%pwd" }, { "uid": "Bark", "pwd": "my%%%pwd" }, { "uid": "Bark", "pwd": "myBIGpwd" } ]'; SELECT JSON_SEARCH(@json, 'all', 'my%pwd', '!') AS "Not Escaped", JSON_SEARCH(@json, 'all', 'my!%pwd', '!') AS "Escaped";
Výsledek:
+--------------------------------------+------- -----+| Neunikl | Utekl |+--------------------------------------+-------- ----+| ["$[0].pwd", "$[1].pwd", "$[2].pwd"] | "$[0].pwd" |+--------------------------------------+- -----------+Dostaneme tedy stejný výsledek jako v předchozím příkladu. Jediný rozdíl je v tom, že jsme zadali jiný únikový znak. V tomto případě jsme uvedli, že vykřičník (
!
) je znak escape.Nulové argumenty
Pokud je některý z argumentů vyhledávacího řetězce, vyhledávacího řetězce nebo cesty
NULL
, výsledkem jeNULL
:SELECT JSON_SEARCH(null, 'all', 's', '', '$') AS a, JSON_SEARCH('{"a":1}', 'all', null, '', '$') AS b, JSON_SEARCH('{"a":1}', 'all', 's', '', null) AS c;
Výsledek:
+------+------+------+| a | b | c |+------+------+------+| NULL | NULL | NULL |+------+------+------+Nesprávný počet parametrů
Pokud neposkytnete žádné argumenty, dojde k chybě:
SELECT JSON_SEARCH();
Výsledek:
CHYBA 1582 (42000):Nesprávný počet parametrů ve volání nativní funkce 'JSON_SEARCH'Je to stejné, když uvedete příliš málo argumentů:
SELECT JSON_SEARCH('{"a":1}', 'all');
Výsledek:
CHYBA 1582 (42000):Nesprávný počet parametrů ve volání nativní funkce 'JSON_SEARCH'