sql >> Databáze >  >> RDS >> MariaDB

MariaDB JSON_SEARCH() Vysvětleno

V MariaDB, JSON_SEARCH() je vestavěná funkce, která vám umožňuje získat cestu k dané hodnotě v dokumentu JSON.

Přijímá dokument JSON a řetězec jako argumenty a vrací cestu k danému řetězci v dokumentu.

Syntaxe

Syntaxe vypadá takto:

JSON_SEARCH(
    json_doc, 
    return_arg, 
    search_str[, escape_char[, path] ...]
    ) 

Kde:

  • json_doc je dokument JSON a search_str je řetězec.
  • return_arg je klíčové slovo one nebo all . Pokud použijete one , vrátí se pouze první cesta. Všechny ostatní výskyty jsou ignorovány. Která cesta je považována za „první“ není definováno (podle dokumentace MariaDB). Pokud all je zadáno, jsou vráceny cesty všech výskytů. Pokud existuje více cest, jsou automaticky zabaleny jako pole.
  • escape_char argument je volitelný znak, který lze použít jako znak escape.
  • path argument je volitelný argument, který určuje, kde začíná cesta „nejvyšší úrovně“ v dokumentu JSON.

Příklad

Zde je příklad k demonstraci:

SET @json = '
    { 
        "name" : "Wag", 
        "type" : "Dog" 
    }';

SELECT JSON_SEARCH(@json, 'one', 'Wag'); 

Výsledek:

+----------------------------------+| JSON_SEARCH(@json, 'one', 'Wag') |+----------------------------------+ | "$.name" |+----------------------------------+

Zde je příklad vrácení cesty pro prvek v poli:

SET @json = '
    { 
        "product" : "Left Handed Screwdriver", 
        "sizes" : [ "Small", "Medium", "Large" ],
    }';

SELECT JSON_SEARCH(@json, 'one', 'Medium'); 

Výsledek:

+-------------------------------------+| JSON_SEARCH(@json, 'jeden', "střední") |+----------------------------------- --+| "$.sizes[1]" |+-------------------------------------+ 

Pole jsou založeny na nule, a proto $.sizes[1] odkazuje na druhý prvek v poli.

Více výskytů

Pokud chcete vrátit všechny cesty, které obsahují řetězec, použijte all místo one pro druhý argument.

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'); 

Výsledek:

+----------------------------------+| JSON_SEARCH(@json, 'all', "Pes") |+----------------------------------+ | ["$[0].type", "$[1].type"] |+------------------------------ -----+

Pokud změníme all na one , stane se toto:

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'); 

Výsledek:

+----------------------------------+| JSON_SEARCH(@json, 'one', "Pes") |+----------------------------------+ | "$[0].type" |+----------------------------------+

Je vrácena pouze jedna cesta.

Zadejte cestu

Zde je příklad, který určuje cestu, kterou chcete v dokumentu hledat:

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; 

Výsledek:

+---------------------------------------------- --------------------+| Výsledek |+----------------------------------------------- ------------------+| ["$.details.awards.NZ Dog Award", "$.details.awards.Sumo 2021"] |+------------------------ -----------------------------------------+

V tomto případě řetězec dog ve skutečnosti se v dokumentu vyskytuje třikrát, ale pouze dvakrát pod zadanou cestou.

Také jsme použili NULL pro argument znaku escape, což má za následek použití výchozího znaku escape, kterým je zpětné lomítko (\ ).

Výchozí únikový znak

Ve výchozím nastavení je znakem escape zpětné lomítko (\ ).

Příklad:

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"; 

Výsledek:

+--------------------------------------+------- -----+| Neunikl | Utekl |+--------------------------------------+-------- ----+| ["$[0].pwd", "$[1].pwd", "$[2].pwd"] | "$[0].pwd" |+--------------------------------------+- -----------+

Znak procenta (% ) je zástupný znak, který odpovídá libovolnému počtu znaků. Pokud mu tedy neunikneme, bude odpovídat libovolnému počtu znaků, včetně znaků, které nejsou znakem procenta.

Když však znak procenta escapujeme znakem escape, bude se shodovat pouze tehdy, když je na daném místě přesně jedno procento.

Výše uvedené výsledky to odrážejí.

Zadejte vlastní únikový znak

V případě potřeby můžete zadat vlastní znak escape. Chcete-li to provést, uveďte jej jako čtvrtý argument.

Příklad:

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"; 

Výsledek:

+--------------------------------------+------- -----+| Neunikl | Utekl |+--------------------------------------+-------- ----+| ["$[0].pwd", "$[1].pwd", "$[2].pwd"] | "$[0].pwd" |+--------------------------------------+- -----------+

Dostaneme tedy stejný výsledek jako v předchozím příkladu. Jediný rozdíl je v tom, že jsme zadali jiný únikový znak. V tomto případě jsme uvedli, že vykřičník (! ) je znak escape.

Nulové argumenty

Pokud je některý z argumentů vyhledávacího řetězce, vyhledávacího řetězce nebo cesty NULL , výsledkem je 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; 

Výsledek:

+------+------+------+| a | b | c |+------+------+------+| NULL | NULL | NULL |+------+------+------+

Nesprávný počet parametrů

Pokud neposkytnete žádné argumenty, dojde k chybě:

SELECT JSON_SEARCH(); 

Výsledek:

CHYBA 1582 (42000):Nesprávný počet parametrů ve volání nativní funkce 'JSON_SEARCH'

Je to stejné, když uvedete příliš málo argumentů:

SELECT JSON_SEARCH('{"a":1}', 'all'); 

Výsledek:

CHYBA 1582 (42000):Nesprávný počet parametrů ve volání nativní funkce 'JSON_SEARCH'

  1. Geniální nástroj pro změnu hesla SQL pro resetování hesla SQL

  2. Vygenerujte sadu nebo sekvenci bez smyček – část 2

  3. Jak vytvořím seznam oddělený čárkami pomocí dotazu SQL?

  4. Příklady vztahů mnoho k mnoha