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

MariaDB JSON_SEARCH() Обяснено

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 5 лесни стъпки, за да започнете с MariaDB и Tableau

  2. Как да покажа всички локали в MariaDB

  3. Как TO_CHAR() работи в MariaDB

  4. Най-добрите инструменти с отворен код за миграции на MySQL и MariaDB

  5. Как работи FROM_BASE64() в MariaDB