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é slovoone
neboall
. Pokud použijeteone
, vyhledávání se zastaví, jakmile je nalezen první výskyt. To znamená, že funkce vrací pouze cestu první instance hledaného řetězce. Pokudall
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
nebopath
argumenty jsouNULL
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
neboall
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
_
sJ
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 |+--------+