Mysql
 sql >> база данни >  >> RDS >> Mysql

JSON_SEARCH() – Намерете пътя към низ в JSON документ в MySQL

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да добавя общ ред в MySQL

  2. MYSQL импортира данни от csv с помощта на LOAD DATA INFILE

  3. задаване на глобален sql_mode в mysql

  4. Сравнение на производителността на MySQL:MySQL 5.7 срещу MySQL 8.0

  5. Използване на роли, нови в MySQL 8