I MySQL, JSON_SEARCH()
funktion returnerar sökvägen till en given sträng i ett JSON-dokument.
Du tillhandahåller JSON-dokumentet som ett argument till funktionen. Du tillhandahåller också argumentet som bestämmer den faktiska strängen som ska sökas (inklusive eventuella escape-tecken), samt ett nyckelord för att indikera om sökvägen för alla instanser ska returneras eller bara en.
Syntax
Syntaxen ser ut så här:
JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] ...])
Förklaring av varje argument följer.
json_doc
är JSON-dokumentet att söka ione_or_all
är nyckelordetone
ellerall
. Om du använderone
, stoppas sökningen när den första förekomsten har hittats. Det vill säga, funktionen returnerar endast sökvägen för den första instansen av söksträngen. Omall
anges, returneras sökvägarna för alla förekomster så att inga dubbletter av sökvägar inkluderas. Om det finns flera sökvägar, radbryts de automatiskt som en array.search_str
är den faktiska strängen att returnera sökvägen till.escape_char
är ett valfritt tecken att använda som ett escape-tecken. Det måste vara en konstant som är tom eller ett tecken. Om du inte anger detta argument (eller om det är NULL), är escape-tecknet omvänt snedstreck (\
).path
är ett valfritt argument för att avgöra var "top-level"-sökvägen börjar i JSON-dokumentet.
Inom search_str
argument, %
och _
tecken fungerar precis som de gör när de används med LIKE
operator:%
matchar valfritt antal tecken (inklusive noll tecken) och _
matchar exakt ett tecken.
För att ange en bokstavlig %
eller _
tecken i söksträngen, föregå det av escape-tecknet.
Exempel 1 – Grundläggande användning
Här är ett exempel att visa.
SELECT JSON_SEARCH('{"Name":"Bart", "Age":10}', 'one', 'Bart') Resultat;
Resultat:
+----------+| Resultat |+----------+| "$.Name" |+----------+
Exempel 2 – Arrayer
Här är ett exempel på hur du hittar en sträng i en array.
SET @doc ='{"Namn":"Bart", "Hobbies":["Skateboard", "Og"]}';VÄLJ JSON_SEARCH(@doc, 'one', 'Og') Resultat;
Resultat:
+----------------+| Resultat |+----------------+| "$.Hobbies[1]" |+----------------+
Matriser använder nollbaserad numrering, så detta resultat indikerar det andra elementet.
Exempel 3 – Icke-existerande sträng
Om du anger en sträng som inte finns returneras ett NULL-värde.
SET @doc ='{"Namn":"Bart", "Hobbies":["Skateboardåkning", "Ostök"]}';SELECT JSON_SEARCH(@doc, 'one', 'Homer') Resultat;
Resultat:
+--------+| Resultat |+--------+| NULL |+--------+
Du får också ett NULL-värde om något av json_doc
, search_str
, eller path
argument är NULL
eller om det inte finns någon sökväg inom JSON-objektet.
Exempel 4 – Flera förekomster av en sträng
Om JSON-dokumentet innehåller flera förekomster av samma sträng, kommer resultatet att bero på om du anger one
eller all
som det andra argumentet.
Om du använder one
, endast den första förekomsten returneras (förutsatt att det finns minst en förekomst):
SET @doc ='{"Name":"Bart", "Friends":["Bart", "Milhouse"]}';SELECT JSON_SEARCH(@doc, 'one', 'Bart') Resultat;
Resultat:
+----------+| Resultat |+----------+| "$.Name" |+----------+
Om du använder all
, returneras sökvägarna för alla händelser. Om det finns mer än en sökväg lindas de automatiskt som en array.
SET @doc ='{"Name":"Bart", "Friends":["Bart", "Milhouse"]}';SELECT JSON_SEARCH(@doc, 'all', 'Bart') Resultat;
Resultat:
+------------------------------------+| Resultat |+------------------------------------+| ["$.Name", "$.Friends[0]"] |+----------------------------------+
Du kan också ange en sökväg som endast returnerar dessa resultat från en angiven sökväg. Mer om det nedan (under Exempel 8 – Ange en sökväg ).
Exempel 5 – Jokertecken
Du kan använda jokertecken enligt syntaxen ovan. Du kan till exempel använda %
för att matcha valfritt antal tecken.
SET @doc ='{"Namn":"Bart", "Hobbies":["Skateboard", "Og"]}';SELECT JSON_SEARCH(@doc, 'one', 'Skate%') Resultat;
Resultat:
+----------------+| Resultat |+----------------+| "$.Hobbies[0]" |+----------------+
Och du kan använda _
för att bara matcha ett tecken.
SET @doc ='{"Name":"Bart", "Hobbies":["Skateboarding", "Og"]}';SELECT JSON_SEARCH(@doc, 'one', 'Bar_') Resultat;
Resultat:
+----------+| Resultat |+----------+| "$.Name" |+----------+
Om vi skulle använda _
i föregående exempel skulle vi få ett NULL-resultat.
SET @doc ='{"Namn":"Bart", "Hobbies":["Skateboard", "Og"]}';SELECT JSON_SEARCH(@doc, 'one', 'Skate_') Resultat;
Resultat:
+--------+| Resultat |+--------+| NULL |+--------+
Exempel 6 – Standard Escape-tecken
Om du behöver söka efter en sträng som faktiskt innehåller något av ovanstående jokertecken, måste du undkomma tecknet. Det säger till MySQL att använda den som en bokstavlig sträng (istället för att tolka den som ett jokertecken).
SET @doc ='{"userid":"bart_simpson", "pwd":"pass%word"}';VÄLJ JSON_SEARCH(@doc, 'one', 'pass\%word') Resultat;Resultat:
+--------+| Resultat |+---------+| "$.pwd" |+--------+Vid första anblicken kanske du tror att snedstrecket var onödigt, för trots allt skulle vi få samma resultat om vi gör det här:
SET @doc ='{"userid":"bart_simpson", "pwd":"pass%word"}';SELECT JSON_SEARCH(@doc, 'one', 'pass%word') Resultat;>Resultat:
+--------+| Resultat |+---------+| "$.pwd" |+--------+Men problemet med detta tillvägagångssätt är att vi också får samma resultat om vi gör detta:
SET @doc ='{"userid":"bart_simpson", "pwd":"pass%BLAH-BLAH-BLAH-word"}';VÄLJ JSON_SEARCH(@doc, 'one', 'pass%word' ) 'Resultat';Resultat:
+--------+| Resultat |+---------+| "$.pwd" |+--------+Så snedstrecket informerar MySQL om att vi bara letar efter en enda instans av
%
som en bokstavlig sträng och inte för valfritt antal andra tecken.Samma koncept gäller för understreck-karaktären.
Om vi gör detta:
SET @doc ='{"userid":"bart_simpson", "pwd":"pass%word"}';SELECT JSON_SEARCH(@doc, 'one', 'bart\_simpson') 'Escaped', JSON_SEARCH (@doc, 'one', 'bart_simpson') 'Not Escaped';Vi får detta:
+------------+-------------+| Flydde | Not Escaped |+------------+----------+| "$.userid" | "$.userid" |+------------+-------------+Båda metoderna ger samma resultat.
Men om vi gör detta (ersätt _ med J i användar-id):
SET @doc ='{"userid":"bartJsimpson", "pwd":"pass%word"}';SELECT JSON_SEARCH(@doc, 'one', 'bart\_simpson') 'Escaped', JSON_SEARCH (@doc, 'one', 'bart_simpson') 'Not Escaped';Vi får detta:
+--------+-------------+| Flydde | Not Escaped |+--------+-------------+| NULL | "$.userid" |+--------+-------------+Exempel 7 – Custom Escape Character
Du kan ange din egen escape-karaktär om det behövs. Du gör detta genom att inkludera det som ett valfritt fjärde argument.
Här är det tidigare exemplet omskrivet för att använda ett annat escape-tecken (användar-id innehåller en
_
tecken).SET @doc ='{"userid":"bart_simpson", "pwd":"pass%word"}';VÄLJ JSON_SEARCH(@doc, 'one', 'bart$_simpson', '$') ' Escaped', JSON_SEARCH(@doc, 'one', 'bart_simpson') 'Not Escaped';Resultat:
+------------+-------------+| Flydde | Not Escaped |+------------+----------+| "$.userid" | "$.userid" |+------------+-------------+Och om vi ersätter
_
medJ
i användar-id:SET @doc ='{"userid":"bartJsimpson", "pwd":"pass%word"}';VÄLJ JSON_SEARCH(@doc, 'one', 'bart$_simpson', '$') ' Escaped', JSON_SEARCH(@doc, 'one', 'bart_simpson') 'Not Escaped';Resultat:
+--------+-------------+| Flydde | Not Escaped |+--------+-------------+| NULL | "$.userid" |+--------+-------------+Exempel 8 – Ange en sökväg
Du kan också ange en sökväg från vilken du ska börja söka. Här är ett exempel.
SET @data ='{ "Person":{ "Name":"Bart", "Age":10, "Friends":["Bart", "Milhouse"] } }';SELECT JSON_SEARCH(@data , 'alla', 'Bart', NULL, '$.Person.Friends') SOM 'Resultat';Resultat:
+------------------------------+| Resultat |+------------------------------+| "$.Person.Friends[0]" |+-----------------------------+Om vi inte hade angett en sökväg skulle vi få följande resultat.
SET @data ='{ "Person":{ "Name":"Bart", "Age":10, "Friends":["Bart", "Milhouse"] } }';SELECT JSON_SEARCH(@data , 'alla', 'Bart') SOM 'Resultat';Resultat:
+--------------------------------------------------+| Resultat |+--------------------------------------------------+| ["$.Person.Name", "$.Person.Friends[0]"] |+----------------------------------- --------------+Dessutom, om vi hade angett
one
som det andra argumentet (liksom att utelämna sökvägsargumentet) skulle vi sluta med följande.SET @data ='{ "Person":{ "Name":"Bart", "Age":10, "Friends":["Bart", "Milhouse"] } }';SELECT JSON_SEARCH(@data , 'one', 'Bart') AS 'Result';Resultat:
+----------------+| Resultat |+-----------------+| "$.Person.Name" |+----------------+Exempel 9 – Töm dokument
Om dokumentet inte innehåller några sökvägar får du ett NULL-värde.
SELECT JSON_SEARCH('{}', 'all', 'Bart') 'Result';Resultat:
+--------+| Resultat |+--------+| NULL |+--------+