sql >> Database teknologi >  >> RDS >> Mysql

JSON_SEARCH() – Find stien til en streng i et JSON-dokument i MySQL

I MySQL er JSON_SEARCH() funktion returnerer stien til en given streng i et JSON-dokument.

Du angiver JSON-dokumentet som et argument til funktionen. Du angiver også argumentet, der bestemmer den faktiske streng, der skal søges (inklusive eventuelle escape-tegn), samt et nøgleord til at angive, om stien til alle forekomster skal returneres eller kun én.

Syntaks

Syntaksen ser sådan ud:

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

Forklaring af hvert argument følger.

  • json_doc er JSON-dokumentet, der skal søges i
  • one_or_all er søgeordet one eller all . Hvis du bruger one , stoppes søgningen, når den første forekomst er fundet. Det vil sige, at funktionen kun returnerer stien til den første forekomst af søgestrengen. Hvis all er angivet, returneres stierne til alle forekomster, sådan der ikke medtages duplikerede stier. Hvis der er flere stier, pakkes de automatisk som en matrix.
  • search_str er den faktiske streng, der skal returneres stien til.
  • escape_char er et valgfrit tegn, der skal bruges som et escape-tegn. Det skal være en konstant, der er tom eller ét tegn. Hvis du ikke angiver dette argument (eller hvis det er NULL), er escape-tegnet omvendt skråstreg (\ ).
  • path er et valgfrit argument til at bestemme, hvor "top-level"-stien starter i JSON-dokumentet.

Inden for search_str argumentet, % og _ tegn fungerer ligesom de gør, når de bruges sammen med LIKE operator:% matcher et vilkårligt antal tegn (inklusive nul tegn) og _ matcher nøjagtigt ét tegn.

For at angive en bogstavelig % eller _ tegnet i søgestrengen, foran det af escape-tegnet.

Eksempel 1 – Grundlæggende brug

Her er et eksempel til at demonstrere.

SELECT JSON_SEARCH('{"Navn":"Bart", "Alder":10}', 'one', 'Bart') Resultat;

Resultat:

+----------+| Resultat |+----------+| "$.Name" |+----------+

Eksempel 2 – Arrays

Her er et eksempel på at finde en streng i et array.

SET @doc ='{"Navn":"Bart", "Hobbyer":["Skateboarding", "Mischief"]}';VÆLG JSON_SEARCH(@doc, 'one', 'Mischief') Resultat;

Resultat:

+----------------+| Resultat |+----------------+| "$.Hobbyer[1]" |+----------------+

Arrays bruger nul-baseret nummerering, så dette resultat angiver det andet element.

Eksempel 3 – Ikke-eksisterende streng

Hvis du angiver en streng, der ikke eksisterer, returneres en NULL-værdi.

SET @doc ='{"Navn":"Bart", "Hobbyer":["Skateboarding", "Mischief"]}';SELECT JSON_SEARCH(@doc, 'one', 'Homer') Resultat;

Resultat:

+--------+| Resultat |+--------+| NULL |+--------+

Du får også en NULL-værdi, hvis nogen af ​​json_doc , search_str eller path argumenter er NULL eller hvis der ikke findes nogen sti i JSON-objektet.

Eksempel 4 – Flere forekomster af en streng

Hvis JSON-dokumentet indeholder flere forekomster af den samme streng, vil resultatet afhænge af, om du angiver one eller all som det andet argument.

Hvis du bruger one , kun den første forekomst returneres (forudsat at der er mindst én forekomst):

SET @doc ='{"Navn":"Bart", "Venner":["Bart", "Milhouse"]}';SELECT JSON_SEARCH(@doc, 'one', 'Bart') Resultat;

Resultat:

+----------+| Resultat |+----------+| "$.Name" |+----------+

Hvis du bruger all , returneres stierne til alle forekomster. Hvis der er mere end én sti, pakkes de automatisk som en matrix.

SET @doc ='{"Navn":"Bart", "Venner":["Bart", "Milhouse"]}';SELECT JSON_SEARCH(@doc, 'alle', 'Bart') Resultat;

Resultat:

+------------------------------------+| Resultat |+------------------------------------+| ["$.Name", "$.Friends[0]"] |+---------------------------------+

Du kan også angive en sti, der kun returnerer disse resultater fra en specificeret sti. Mere om det nedenfor (under Eksempel 8 – Angiv en sti ).

Eksempel 5 – Jokertegn

Du kan bruge jokertegn som angivet i syntaksen ovenfor. For eksempel kan du bruge % for at matche et vilkårligt antal tegn.

SET @doc ='{"Navn":"Bart", "Hobbyer":["Skateboarding", "Ulykke"]}';SELECT JSON_SEARCH(@doc, 'one', 'Skate%') Resultat; 

Resultat:

+----------------+| Resultat |+----------------+| "$.Hobbyer[0]" |+----------------+

Og du kan bruge _ for kun at matche ét tegn.

SET @doc ='{"Navn":"Bart", "Hobbyer":["Skateboarding", "Mischief"]}';SELECT JSON_SEARCH(@doc, 'one', 'Bar_') Resultat;

Resultat:

+----------+| Resultat |+----------+| "$.Name" |+----------+

Hvis vi skulle bruge _ i det foregående eksempel ville vi få et NULL-resultat.

SET @doc ='{"Name":"Bart", "Hobbies":["Skateboarding", "Mischief"]}';SELECT JSON_SEARCH(@doc, 'one', 'Skate_') Resultat;

Resultat:

+--------+| Resultat |+--------+| NULL |+--------+

Eksempel 6 – Standard Escape-tegn

Hvis du har brug for at søge efter en streng, der faktisk indeholder nogen af ​​ovenstående jokertegn, skal du undslippe tegnet. Det fortæller MySQL at bruge den som en streng bogstavelig (i stedet for at fortolke den som et jokertegn).

SET @doc ='{"userid":"bart_simpson", "pwd":"pass%word"}';VÆLG JSON_SEARCH(@doc, 'one', 'pass\%word') Resultat; 

Resultat:

+--------+| Resultat |+--------+| "$.pwd" |+--------+

Ved første øjekast tænker du måske, at skråstreget var unødvendigt, for trods alt ville vi få det samme resultat, hvis vi gør dette:

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

Resultat:

+--------+| Resultat |+--------+| "$.pwd" |+--------+

Men problemet med denne tilgang er, at vi også får det samme resultat, hvis vi gør dette:

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

Resultat:

+--------+| Resultat |+--------+| "$.pwd" |+--------+

Så skråstregen informerer MySQL om, at vi kun leder efter en enkelt forekomst af % som en streng bogstavelig, og ikke for et hvilket som helst antal andre tegn.

Det samme koncept gælder for understregningstegn.

Hvis vi gør dette:

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 dette:

+------------+-------------+| Undslap | Ikke undslippet |+------------+----------+| "$.brugerid" | "$.userid" |+-------------+-------------+

Begge tilgange giver det samme resultat.

Men hvis vi gør dette (erstat _ med J i bruger-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 dette:

+--------+-------------+| Undslap | Ikke undslippet |+---------+-------------+| NULL | "$.userid" |+--------+-------------+

Eksempel 7 – Custom Escape Character

Du kan angive dit eget escape-karakter, hvis det kræves. Det gør du ved at inkludere det som et valgfrit fjerde argument.

Her er det forrige eksempel omskrevet til at bruge et andet escape-tegn (bruger-id'et indeholder en _ tegn).

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

Resultat:

+------------+-------------+| Undslap | Ikke undslippet |+------------+----------+| "$.brugerid" | "$.userid" |+-------------+-------------+

Og hvis vi erstatter _ med J i bruger-id'et:

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

Resultat:

+--------+-------------+| Undslap | Ikke undslippet |+---------+-------------+| NULL | "$.userid" |+--------+-------------+

Eksempel 8 – Angiv en sti

Du kan også angive en sti, hvorfra du vil begynde at søge fra. Her er et eksempel.

SET @data ='{ "Person":{ "Name":"Bart", "Age":10, "Friends":["Bart", "Milhouse"] } }';SELECT JSON_SEARCH(@data , 'alle', 'Bart', NULL, '$.Person.Friends') SOM 'Resultat';

Resultat:

+------------------------------+| Resultat |+------------------------------+| "$.Person.Friends[0]" |+-----------------------------+

Hvis vi ikke havde angivet en sti, ville vi få følgende resultat.

SET @data ='{ "Person":{ "Name":"Bart", "Age":10, "Friends":["Bart", "Milhouse"] } }';SELECT JSON_SEARCH(@data , 'alle', 'Bart') SOM 'Resultat';

Resultat:

+--------------------------------------------------+| Resultat |+--------------------------------------------------+| ["$.Person.Name", "$.Person.Friends[0]"] |+----------------------------------- --------------+

Desuden, hvis vi havde angivet one som det andet argument (samt at udelade sti-argumentet), ville vi ende med følgende.

SET @data ='{ "Person":{ "Name":"Bart", "Age":10, "Friends":["Bart", "Milhouse"] } }';SELECT JSON_SEARCH(@data , 'one', 'Bart') AS 'Result';

Resultat:

+----------------+| Resultat |+-----------------+| "$.Person.Name" |+-----------------+

Eksempel 9 – Tøm dokument

Hvis dokumentet ikke indeholder stier, får du en NULL-værdi.

SELECT JSON_SEARCH('{}', 'alle', 'Bart') 'Resultat';

Resultat:

+--------+| Resultat |+--------+| NULL |+--------+

  1. Brug af Max()-funktionen til at vælge gruppeværdier

  2. 5 sikkerhedsfordele ved cloud-baserede databaseovervågningsløsninger

  3. Hvordan skriver man en begrænsning vedrørende et maks. antal rækker i postgresql?

  4. SQLite Vælg