sql >> Databasteknik >  >> RDS >> Mysql

JSON_SEARCH() – Hitta sökvägen till en sträng i ett JSON-dokument i MySQL

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 i
  • one_or_all är nyckelordet one eller all . Om du använder one , 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. Om all 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 _ med J 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 |+--------+

  1. MySQL felaktigt strängvärde fel vid spara unicode sträng i Django

  2. Proaktiva SQL Server Health Checks, Del 4:ERRORLOG

  3. Ingen lämplig drivrutin hittades för jdbc:postgresql://192.168.1.8:5432/NexentaSearch

  4. Hur man får första och sista dagen i föregående månad (med tidsstämpel) i SQL Server