В MySQL, JSON_SEARCH()
функцията връща пътя към даден низ в JSON документ.
Вие предоставяте JSON документа като аргумент на функцията. Вие също така предоставяте аргумента, който определя действителния низ за търсене (включително всички escape знаци), както и ключова дума, за да посочите дали да върнете пътя на всички екземпляри или само на един.
Синтаксис
Синтаксисът е така:
JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, път] ...])
Следва обяснение на всеки аргумент.
json_doc
е JSON документът за търсенеone_or_all
е ключовата думаone
илиall
. Ако използватеone
, търсенето се спира, след като бъде намерено първото срещане. Тоест, функцията връща само пътя на първия екземпляр на търсещия низ. Акоall
е посочено, се връщат пътищата на всички събития, така че да не се включват дублиращи се пътища. Ако има няколко пътя, те се обвиват автоматично като масив.search_str
е действителният низ за връщане на пътя.escape_char
е незадължителен знак, който да се използва като escape символ. Тя трябва да е празна константа или един знак. Ако не посочите този аргумент (или ако е NULL), escape символът е обратната наклонена черта (\
).path
е незадължителен аргумент, за да се определи къде започва пътят от „горно ниво“ в JSON документа.
В рамките на search_str
аргумент, %
и _
знаците работят точно както се използват с LIKE
оператор:%
съответства на произволен брой знаци (включително нула знаци) и _
съвпада точно с един знак.
За да посочите литерал %
или _
знак в низа за търсене, предхождайте го от escape знак.
Пример 1 – Основна употреба
Ето пример за демонстрация.
SELECT JSON_SEARCH('{"Име":"Барт", "Възраст":10}', 'един', 'Барт') Резултат;
Резултат:
+---------+| Резултат |+---------+| „$.Име“ |+----------+
Пример 2 – Масиви
Ето пример за намиране на низ в масив.
SET @doc ='{"Име":"Барт", "Хобита":["Скейтборд", "Mischief"]}';ИЗБЕРЕТЕ JSON_SEARCH(@doc, 'един', 'Пакости') Резултат;предварително>Резултат:
+----------------+| Резултат |+----------------+| "$.Хобита[1]" |+----------------+Масивите използват номериране на базата на нула, така че този резултат показва втория елемент.
Пример 3 – Несъществуващ низ
Ако посочите низ, който не съществува, се връща стойност NULL.
SET @doc ='{"Име":"Барт", "Хобита":["Скейтборд", "Mischief"]}';ИЗБЕРЕТЕ JSON_SEARCH(@doc, 'един', 'Homer') Резултат;предварително>Резултат:
+--------+| Резултат |+--------+| NULL |+--------+Освен това ще получите стойност NULL, ако някой от
json_doc
,search_str
илиpath
аргументите саNULL
или ако не съществува път в JSON обекта.Пример 4 – Множество поява на низ
Ако JSON документът съдържа множество срещания на един и същ низ, резултатът ще зависи от това дали сте посочили
one
илиall
като втори аргумент.Ако използвате
one
връща се само първото събитие (ако приемем, че има поне едно събитие):SET @doc ='{"Име":"Барт", "Приятели":["Барт", "Милхаус"]}';ИЗБЕРЕТЕ JSON_SEARCH(@doc, 'един', 'Барт') Резултат;предварително>Резултат:
+---------+| Резултат |+---------+| „$.Име“ |+----------+Ако използвате
all
, пътищата на всички събития се връщат. Ако има повече от един път, те се обвиват автоматично като масив.SET @doc ='{"Име":"Барт", "Приятели":["Барт", "Милхаус"]}';ИЗБЕРЕТЕ JSON_SEARCH(@doc, 'всички', 'Барт') Резултат;предварително>Резултат:
+----------------------------+| Резултат |+----------------------------+| ["$.Name", "$.Friends[0]"] |+----------------------------+Можете също да посочите път, който връща само тези резултати от определен път. Повече за това по-долу (под Пример 8 – Посочване на път ).
Пример 5 – заместващи знаци
Можете да използвате заместващи знаци, както е посочено в синтаксиса по-горе. Например, можете да използвате
%
за да съответства на произволен брой знаци.SET @doc ='{"Име":"Барт", "Хобита":["Skateboarding", "Mischief"]}';SELECT JSON_SEARCH(@doc, 'one', 'Skate%') Резултат;Резултат:
+----------------+| Резултат |+----------------+| "$.Хобита[0]" |+----------------+И можете да използвате
_
за да съответства само на един знак.SET @doc ='{"Име":"Барт", "Хобита":["Скейтборд", "Mischief"]}';ИЗБЕРЕТЕ JSON_SEARCH(@doc, 'един', 'Bar_') Резултат;предварително>Резултат:
+---------+| Резултат |+---------+| „$.Име“ |+----------+Ако трябваше да използваме
_
в предишния пример ще получим резултат NULL.SET @doc ='{"Име":"Барт", "Хобита":["Skateboarding", "Mischief"]}';SELECT JSON_SEARCH(@doc, 'one', 'Skate_') Резултат;предварително>Резултат:
+--------+| Резултат |+--------+| NULL |+--------+Пример 6 – Изходен символ по подразбиране
Ако трябва да търсите низ, който всъщност съдържа някой от горните заместващи знаци, ще трябва да избягате от знака. Това казва на MySQL да го използва като низов литерал (вместо да го интерпретира като заместващ знак).
SET @doc ='{"userid":"bart_simpson", "pwd":"pass%word"}';SELECT JSON_SEARCH(@doc, 'one', 'pass\%word') Резултат;SET @doc ='{"userid":"bart_simpson", "pwd":"pass%word"}'; предварително>Резултат:
+--------+| Резултат |+--------+| "$.pwd" |+---------+На пръв поглед може да си мислите, че обратната наклонена черта е ненужна, защото в крайна сметка ще получим същия резултат, ако направим това:
SET @doc ='{"userid":"bart_simpson", "pwd":"pass%word"}';SELECT JSON_SEARCH(@doc, 'one', 'pass%word') Резултат;>Резултат:
+--------+| Резултат |+--------+| "$.pwd" |+---------+Но проблемът с този подход е, че ние също получаваме същия резултат, ако направим това:
SET @doc ='{"userid":"bart_simpson", "pwd":"pass%BLAH-BLAH-BLAH-word"}';SELECT JSON_SEARCH(@doc, 'един', 'pass%word' ) 'Резултат';Резултат:
+--------+| Резултат |+--------+| "$.pwd" |+---------+Така че обратната наклонена черта информира MySQL, че търсим само един екземпляр на
%
като низов литерал и не за произволен брой други знаци.Същата концепция важи и за символа за долно черта.
Ако направим това:
SET @doc ='{"userid":"bart_simpson", "pwd":"pass%word"}';SELECT JSON_SEARCH(@doc, 'one', 'bart\_simpson') 'Escaped', JSON_SEARCH (@doc, 'one', 'bart_simpson') 'Not Escaped';Получаваме това:
+------------+------------+| Избягал | Неизбяга |+------------+------------+| "$.userid" | "$.userid" |+------------+------------+И двата подхода връщат един и същ резултат.
Но ако направим това (заменете _ с J в потребителския идентификатор):
SET @doc ='{"userid":"bartJsimpson", "pwd":"pass%word"}';SELECT JSON_SEARCH(@doc, 'one', 'bart\_simpson') 'Escaped', JSON_SEARCH (@doc, 'one', 'bart_simpson') 'Not Escaped';Получаваме това:
+--------+------------+| Избягал | Неизбяга |+--------+------------+| NULL | "$.userid" |+---------+------------+Пример 7 – Персонализиран изходен символ
Можете да посочите свой собствен escape символ, ако е необходимо. Можете да направите това, като го включите като незадължителен четвърти аргумент.
Ето предишния пример, пренаписан за използване на различен escape знак (идентификаторът на потребителя включва
_
символ).SET @doc ='{"userid":"bart_simpson", "pwd":"pass%word"}';SELECT JSON_SEARCH(@doc, 'one', 'bart$_simpson', '$') ' Escaped', JSON_SEARCH(@doc, 'one', 'bart_simpson') 'Не е escaped';Резултат:
+------------+------------+| Избягал | Неизбяга |+------------+------------+| "$.userid" | "$.userid" |+------------+------------+И ако заменим
_
сJ
в потребителския идентификатор:SET @doc ='{"userid":"bartJsimpson", "pwd":"pass%word"}';SELECT JSON_SEARCH(@doc, 'one', 'bart$_simpson', '$') ' Escaped', JSON_SEARCH(@doc, 'one', 'bart_simpson') 'Не е escaped';Резултат:
+--------+------------+| Избягал | Неизбяга |+--------+------------+| NULL | "$.userid" |+---------+------------+Пример 8 – Посочете път
Можете също да посочите път, от който да започнете търсенето. Ето един пример.
SET @data ='{ "Лице":{ "Име":"Барт", "Възраст":10, "Приятели":["Барт", "Милхаус"] } }';ИЗБЕРЕТЕ JSON_SEARCH(@data , 'all', 'Bart', NULL, '$.Person.Friends') КАТО 'Резултат';Резултат:
<пред>+-----------------------+| Резултат |+-----------------------+| "$.Person.Friends[0]" |+-----------------------+Ако не бяхме посочили път, щяхме да получим следния резултат.
SET @data ='{ "Лице":{ "Име":"Барт", "Възраст":10, "Приятели":["Барт", "Милхаус"] } }';ИЗБЕРЕТЕ JSON_SEARCH(@data , 'всички', 'Барт') КАТО 'Резултат';Резултат:
+------------------------------------+| Резултат |+------------------------------------+| ["$.Person.Name", "$.Person.Friends[0]"] |+---------------------------- --------------+Освен това, ако сме посочили
one
като втори аргумент (както и да пропуснем аргумента path), ще получим следното.SET @data ='{ "Лице":{ "Име":"Барт", "Възраст":10, "Приятели":["Барт", "Милхаус"] } }';ИЗБЕРЕТЕ JSON_SEARCH(@data , 'един', 'Барт') КАТО 'Резултат';Резултат:
+-----------------+| Резултат |+-----------------+| "$.Person.Name" |+-----------------+Пример 9 – Празен документ
Ако документът не съдържа пътища, ще получите стойност NULL.
SELECT JSON_SEARCH('{}', 'всички', 'Барт') 'Резултат';Резултат:
+--------+| Резултат |+--------+| NULL |+--------+