В 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“