sql >> Databáze >  >> RDS >> Mysql

JSON_SEARCH() – Najděte cestu k řetězci v dokumentu JSON v MySQL

V MySQL je to JSON_SEARCH() funkce vrací cestu k danému řetězci v dokumentu JSON.

Jako argument funkci poskytnete dokument JSON. Uvedete také argument, který určuje skutečný řetězec, který se má prohledat (včetně jakýchkoli únikových znaků), a také klíčové slovo, které určí, zda vrátit cestu všech instancí nebo pouze jedné.

Syntaxe

Syntaxe vypadá takto:

JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, cesta] ...])

Následuje vysvětlení každého argumentu.

  • json_doc je dokument JSON k vyhledávání
  • one_or_all je klíčové slovo one nebo all . Pokud použijete one , vyhledávání se zastaví, jakmile je nalezen první výskyt. To znamená, že funkce vrací pouze cestu první instance hledaného řetězce. Pokud all je zadáno, jsou vráceny cesty všech výskytů tak, že nejsou zahrnuty žádné duplicitní cesty. Pokud existuje více cest, jsou automaticky zabaleny jako pole.
  • search_str je skutečný řetězec, který má vrátit cestu.
  • escape_char je volitelný znak, který lze použít jako únikový znak. Musí to být konstanta, která je prázdná, nebo jeden znak. Pokud tento argument nezadáte (nebo pokud je NULL), znakem escape je zpětné lomítko (\ ).
  • path je volitelný argument pro určení, kde začíná cesta „nejvyšší úrovně“ v dokumentu JSON.

V rámci search_str argument, % a _ znaky fungují stejně jako při použití s ​​LIKE operátor:% odpovídá libovolnému počtu znaků (včetně nuly) a _ odpovídá přesně jednomu znaku.

Chcete-li zadat doslovné % nebo _ znak ve vyhledávacím řetězci, před ním znak escape.

Příklad 1 – Základní použití

Zde je příklad k demonstraci.

SELECT JSON_SEARCH('{"Jméno":"Bart", "Věk":10}', 'jeden', 'Bart') Výsledek;

Výsledek:

+-----------+| Výsledek |+----------+| "$.Name" |+----------+

Příklad 2 – Pole

Zde je příklad nalezení řetězce v poli.

SET @doc ='{"Jméno":"Bart", "Hobbies":["Skateboarding", "Mischief"]}';SELECT JSON_SEARCH(@doc, 'one', 'Neplechy') Výsledek; 

Výsledek:

+-----------------+| Výsledek |+-----------------+| "$.Hobbies[1]" |+----------------+

Pole používají číslování založené na nule, takže tento výsledek označuje druhý prvek.

Příklad 3 – Neexistující řetězec

Pokud zadáte řetězec, který neexistuje, vrátí se hodnota NULL.

SET @doc ='{"Jméno":"Bart", "Hobbies":["Skateboarding", "Mischief"]}';SELECT JSON_SEARCH(@doc, 'one', 'Homer') Výsledek; 

Výsledek:

+---------+| Výsledek |+--------+| NULL |+--------+

Pokud některý z json_doc, získáte také hodnotu NULL , search_str nebo path argumenty jsou NULL nebo pokud v objektu JSON neexistuje žádná cesta.

Příklad 4 – Vícenásobné výskyty řetězce

Pokud dokument JSON obsahuje více výskytů stejného řetězce, bude výsledek záviset na tom, zda zadáte one nebo all jako druhý argument.

Pokud použijete one , je vrácen pouze první výskyt (za předpokladu, že existuje alespoň jeden výskyt):

SET @doc ='{"Jméno":"Bart", "Přátelé":["Bart", "Milhouse"]}';SELECT JSON_SEARCH(@doc, 'one', 'Bart') Výsledek; 

Výsledek:

+-----------+| Výsledek |+----------+| "$.Name" |+----------+

Pokud použijete all , jsou vráceny cesty všech výskytů. Pokud existuje více než jedna cesta, jsou automaticky zabaleny jako pole.

SET @doc ='{"Jméno":"Bart", "Přátelé":["Bart", "Milhouse"]}';SELECT JSON_SEARCH(@doc, 'all', 'Bart') Výsledek; 

Výsledek:

+----------------------------+| Výsledek |+----------------------------+| ["$.Name", "$.Friends[0]"] |+----------------------------+

Můžete také zadat cestu, která vrátí pouze výsledky ze zadané cesty. Více o tom níže (v Příklad 8 – Zadejte cestu ).

Příklad 5 – Zástupné znaky

Můžete použít zástupné znaky, jak je uvedeno ve výše uvedené syntaxi. Můžete například použít % aby odpovídal libovolnému počtu znaků.

SET @doc ='{"Jméno":"Bart", "Hobbies":["Skateboarding", "Nešlechetnost"]}';SELECT JSON_SEARCH(@doc, 'one', 'Skate%') Výsledek; 

Výsledek:

+-----------------+| Výsledek |+-----------------+| "$.Hobbies[0]" |+-----------------+

A můžete použít _ aby odpovídal pouze jednomu znaku.

SET @doc ='{"Jméno":"Bart", "Hobbies":["Skateboarding", "Mischief"]}';SELECT JSON_SEARCH(@doc, 'one', 'Bar_') Výsledek; 

Výsledek:

+-----------+| Výsledek |+----------+| "$.Name" |+----------+

Pokud bychom použili _ v předchozím příkladu bychom dostali výsledek NULL.

SET @doc ='{"Jméno":"Bart", "Hobbies":["Skateboarding", "Mischief"]}';SELECT JSON_SEARCH(@doc, 'one', 'Skate_') Výsledek; 

Výsledek:

+---------+| Výsledek |+--------+| NULL |+--------+

Příklad 6 – Výchozí únikový znak

Pokud potřebujete vyhledat řetězec, který skutečně obsahuje některý z výše uvedených zástupných znaků, budete muset znak zakódovat. To říká MySQL, aby ho použila jako řetězcový literál (místo toho, aby jej interpretovala jako zástupný znak).

SET @doc ='{"userid":"bart_simpson", "pwd":"pass%word"}';SELECT JSON_SEARCH(@doc, 'one', 'pass\%word') Výsledek; 

Výsledek:

+----------+| Výsledek |+----------+| "$.pwd" |+---------+

Na první pohled si možná říkáte, že zpětné lomítko bylo zbytečné, protože koneckonců bychom dostali stejný výsledek, kdybychom to udělali takto:

SET @doc ='{"userid":"bart_simpson", "pwd":"pass%word"}';SELECT JSON_SEARCH(@doc, 'one', 'pass%word') Výsledek;

Výsledek:

+----------+| Výsledek |+----------+| "$.pwd" |+---------+

Problém s tímto přístupem je ale v tom, že stejný výsledek dostaneme, když uděláme toto:

SET @doc ='{"userid":"bart_simpson", "pwd":"pass%BLAH-BLAH-BLAH-word"}';SELECT JSON_SEARCH(@doc, 'one', 'pass%word' ) 'Výsledek';

Výsledek:

+----------+| Výsledek |+----------+| "$.pwd" |+---------+

Takže zpětné lomítko informuje MySQL, že hledáme pouze jednu instanci % jako řetězcový literál a ne pro libovolný počet dalších znaků.

Stejný koncept platí pro znak podtržítka.

Pokud uděláme toto:

SET @doc ='{"userid":"bart_simpson", "pwd":"pass%word"}';SELECT JSON_SEARCH(@doc, 'one', 'bart\_simpson') 'Escaped', JSON_SEARCH (@doc, 'one', 'bart_simpson') 'Not Escaped';

Dostáváme toto:

+------------+-------------+| Utekl | Neunikl |+------------+-------------+| "$.userid" | "$.userid" |+------------+-------------+

Oba přístupy vrátí stejný výsledek.

Ale pokud to uděláme (nahradíme _ za J v uživatelském id):

SET @doc ='{"userid":"bartJsimpson", "pwd":"pass%word"}';SELECT JSON_SEARCH(@doc, 'one', 'bart\_simpson') 'Escaped', JSON_SEARCH (@doc, 'one', 'bart_simpson') 'Not Escaped';

Dostáváme toto:

+---------+-------------+| Utekl | Neunikl |+---------+-------------+| NULL | "$.userid" |+---------+-------------+

Příklad 7 – Vlastní únikový znak

V případě potřeby můžete zadat svůj vlastní escape znak. Toho dosáhnete tak, že jej zahrnete jako volitelný čtvrtý argument.

Zde je předchozí příklad přepsaný tak, aby používal jiný escape znak (uživatelské jméno obsahuje _ postava).

SET @doc ='{"userid":"bart_simpson", "pwd":"pass%word"}';SELECT JSON_SEARCH(@doc, 'one', 'bart$_simpson', '$') ' Escaped', JSON_SEARCH(@doc, 'one', 'bart_simpson') 'Not Escaped';

Výsledek:

+------------+-------------+| Utekl | Neunikl |+------------+-------------+| "$.userid" | "$.userid" |+------------+-------------+

A pokud nahradíme _ s J v id uživatele:

SET @doc ='{"userid":"bartJsimpson", "pwd":"pass%word"}';SELECT JSON_SEARCH(@doc, 'one', 'bart$_simpson', '$') ' Escaped', JSON_SEARCH(@doc, 'one', 'bart_simpson') 'Not Escaped';

Výsledek:

+---------+-------------+| Utekl | Neunikl |+---------+-------------+| NULL | "$.userid" |+---------+-------------+

Příklad 8 – Zadejte cestu

Můžete také zadat cestu, ze které chcete začít hledat. Zde je příklad.

SET @data ='{ "Osoba":{ "Jméno":"Bart", "Věk":10, "Přátelé":["Bart", "Milhouse"] } }';SELECT JSON_SEARCH(@data , 'all', 'Bart', NULL, '$.Person.Friends') AS 'Result';

Výsledek:

+-----------------------+| Výsledek |+-----------------------+| "$.Person.Friends[0]" |+-----------------------+

Pokud bychom nezadali cestu, dostali bychom následující výsledek.

SET @data ='{ "Osoba":{ "Jméno":"Bart", "Věk":10, "Přátelé":["Bart", "Milhouse"] } }';SELECT JSON_SEARCH(@data , 'all', 'Bart') AS 'Result';

Výsledek:

+------------------------------------------+| Výsledek |+------------------------------------------+| ["$.Person.Name", "$.Person.Friends[0]"] |+---------------------------- --------------+

Navíc, pokud bychom zadali one jako druhý argument (stejně jako vynechání argumentu cesty) bychom skončili s následujícím.

SET @data ='{ "Osoba":{ "Jméno":"Bart", "Věk":10, "Přátelé":["Bart", "Milhouse"] } }';SELECT JSON_SEARCH(@data , 'jedna', 'Bart') JAKO 'Výsledek';

Výsledek:

+------------------+| Výsledek |+------------------+| "$.Person.Name" |+-----------------+

Příklad 9 – Prázdný dokument

Pokud dokument neobsahuje žádné cesty, získáte hodnotu NULL.

SELECT JSON_SEARCH('{}', 'all', 'Bart') 'Výsledek';

Výsledek:

+---------+| Výsledek |+--------+| NULL |+--------+

  1. Co představuje double v SQL serveru?

  2. Vícesloupcový index na 3 polích s heterogenními datovými typy

  3. Zkombinujte dotazy vnořené smyčky s výsledkem nadřazeného pole - pg-promise

  4. Základní správa Srovnání mezi Oracle, MSSQL, MySQL, PostgreSQL