В MariaDB, JSON_SEARCH()
е вградена функция, която ви позволява да получите пътя до дадена стойност в JSON документ.
Той приема документа JSON и низ като аргументи и връща пътя към дадения низ в документа.
Синтаксис
Синтаксисът е така:
JSON_SEARCH(
json_doc,
return_arg,
search_str[, escape_char[, path] ...]
)
Къде:
json_doc
е JSON документът иsearch_str
е низът.return_arg
е ключовата думаone
илиall
. Ако използватеone
връща се само първия път. Всички други събития се игнорират. Кой път се счита за „първи“ е недефиниран (според документацията на MariaDB). Акоall
е посочено, се връщат пътищата на всички събития. Ако има няколко пътя, те се обвиват автоматично като масив.escape_char
аргументът е незадължителен знак, който да се използва като escape символ.path
Аргументът е незадължителен аргумент, за да се определи къде започва пътят на „най-високо ниво“ в JSON документа.
Пример
Ето пример за демонстрация:
SET @json = '
{
"name" : "Wag",
"type" : "Dog"
}';
SELECT JSON_SEARCH(@json, 'one', 'Wag');
Резултат:
+---------------------------------+| JSON_SEARCH(@json, 'едно', 'Размахване') |+----------------------------------+ | "$.name" |+---------------------------------+
Ето пример за връщане на пътя за елемент в масив:
SET @json = '
{
"product" : "Left Handed Screwdriver",
"sizes" : [ "Small", "Medium", "Large" ],
}';
SELECT JSON_SEARCH(@json, 'one', 'Medium');
Резултат:
+-------------------------------------+| JSON_SEARCH(@json, 'един', "Средно") |+---------------------------------- --+| "$.sizes[1]" |+-------------------------------------+предварително>Масивите са базирани на нула и така
$.sizes[1]
се отнася до втория елемент в масива.Множество събития
Ако искате да върнете всички пътища, които съдържат низа, използвайте
all
вместоone
за втория аргумент.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');
Резултат:
+---------------------------------+| JSON_SEARCH(@json, 'всички', "Куче") |+----------------------------------+ | ["$[0].type", "$[1].type"] |+---------------------------- -----+Ако променим
all
доone
, ето какво се случва: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');
Резултат:
+---------------------------------+| JSON_SEARCH(@json, 'един', "Куче") |+----------------------------------+ | "$[0].type" |+---------------------------------+Връща се само един път.
Посочете път
Ето пример, който посочва път, по който да търсите в документа:
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;
Резултат:
+------------------------------------------------------- -------------------+| Резултат |+-------------------------------------------------------- ------------------+| ["$.details.awards.NZ Dog Award", "$.details.awards.Sumo 2021"] |+------------------------ -----------------------------------------+В този случай низът
dog
всъщност се среща три пъти в документа, но само два пъти под посочения път.Също така използвахме
NULL
за аргумента на escape-символа, който води до използването на escape-символа по подразбиране, който е обратната наклонена черта (\
).Изходен символ по подразбиране
По подразбиране escape символът е обратна наклонена черта (
\
).Пример:
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";
Резултат:
+----------------------------------------+------- -----+| Не е избягал | Избягал |+-----------------------------------------+-------- ----+| ["$[0].pwd", "$[1].pwd", "$[2].pwd"] | "$[0].pwd" |+----------------------------------------------+- -----------+Знакът за процент (
%
) е заместващ знак, който съответства на произволен брой знаци. Следователно, ако не го избягаме, той ще съответства на произволен брой знаци, включително знаци, които не са знаци за проценти.Но когато избягаме от знака за процент с escape-символа, той ще съвпадне само когато има точно един процентен знак на това място.
Горните резултати отразяват това.
Посочете персонализиран изходен знак
Можете да посочите персонализиран escape знак, ако е необходимо. За да направите това, предоставете го като четвърти аргумент.
Пример:
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";
Резултат:
+----------------------------------------+------- -----+| Не е избягал | Избягал |+-----------------------------------------+-------- ----+| ["$[0].pwd", "$[1].pwd", "$[2].pwd"] | "$[0].pwd" |+----------------------------------------------+- -----------+Така получаваме същия резултат като в предишния пример. Единствената разлика е, че посочихме различен escape символ. В този случай посочихме, че удивителният знак (
!
) е escape-символът.Нулеви аргументи
Ако някой от аргументите за низ за търсене, низ за търсене или път е
NULL
, резултатът еNULL
: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;
Резултат:
+------+------+------+| а | б | c |+------+------+------+| NULL | NULL | NULL |+------+------+------+Неправилен брой параметри
Предоставянето на без аргументи води до грешка:
SELECT JSON_SEARCH();
Резултат:
ГРЕШКА 1582 (42000):Неправилен брой параметри в извикването на естествена функция „JSON_SEARCH“Същото е, когато предоставите твърде малко аргументи:
SELECT JSON_SEARCH('{"a":1}', 'all');
Резултат:
ГРЕШКА 1582 (42000):Неправилен брой параметри в извикването на естествена функция „JSON_SEARCH“