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 ione_or_all
er søgeordetone
ellerall
. Hvis du brugerone
, 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. Hvisall
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
_
medJ
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 |+--------+