I MariaDB, JSON_SEARCH() er en indbygget funktion, der giver dig mulighed for at få stien til en given værdi i et JSON-dokument.
Den accepterer JSON-dokumentet og en streng som argumenter og returnerer stien til den givne streng i dokumentet.
Syntaks
Syntaksen ser sådan ud:
JSON_SEARCH(
json_doc,
return_arg,
search_str[, escape_char[, path] ...]
) Hvor:
json_docer JSON-dokumentet ogsearch_strer strengen.return_arger søgeordetoneellerall. Hvis du brugerone, kun den første sti returneres. Alle andre hændelser ignoreres. Hvilken sti, der betragtes som "først", er udefineret (ifølge MariaDB-dokumentationen). Hvisaller angivet, returneres stierne til alle forekomster. Hvis der er flere stier, pakkes de automatisk som en matrix.escape_charargument er et valgfrit tegn, der skal bruges som et escape-tegn.pathargument er et valgfrit argument til at bestemme, hvor "top-level"-stien starter i JSON-dokumentet.
Eksempel
Her er et eksempel til demonstration:
SET @json = '
{
"name" : "Wag",
"type" : "Dog"
}';
SELECT JSON_SEARCH(@json, 'one', 'Wag'); Resultat:
+----------------------------------------+| JSON_SEARCH(@json, 'one', 'Wag') |+----------------------------------------+ | "$.name" |+-----------------------------------------+
Her er et eksempel på returnering af stien for et element i en matrix:
SET @json = '
{
"product" : "Left Handed Screwdriver",
"sizes" : [ "Small", "Medium", "Large" ],
}';
SELECT JSON_SEARCH(@json, 'one', 'Medium'); Resultat:
+--------------------------------------------+| JSON_SEARCH(@json, 'one', "Medium") |+---------------------------------------- --+| "$.størrelser[1]" |+--------------------------------------------+Arrays er nul-baserede, og så
$.sizes[1]henviser til det andet element i arrayet.Flere forekomster
Hvis du vil returnere alle stier, der indeholder strengen, skal du bruge
alli stedet foronefor det andet argument.SET @json = '[ { "name": "Wag", "type": "Dog", "weight": 20 }, { "name": "Bark", "type": "Dog", "weight": 10 }, { "name": "Meow", "type": "Cat", "weight": 7 } ]'; SELECT JSON_SEARCH(@json, 'all', 'Dog');Resultat:
+----------------------------------------+| JSON_SEARCH(@json, 'alle', "Hund") |+----------------------------------------+ | ["$[0].type", "$[1].type"] |+---------------------------------------- -----+Hvis vi ændrer
alltilone, her er hvad der sker:SET @json = '[ { "name": "Wag", "type": "Dog", "weight": 20 }, { "name": "Bark", "type": "Dog", "weight": 10 }, { "name": "Meow", "type": "Cat", "weight": 7 } ]'; SELECT JSON_SEARCH(@json, 'one', 'Dog');Resultat:
+----------------------------------------+| JSON_SEARCH(@json, 'en', "Hund") |+----------------------------------------+ | "$[0].type" |+----------------------------------------+Kun én sti returneres.
Angiv en sti
Her er et eksempel, der specificerer en sti, som der skal søges efter i dokumentet:
SET @json = ' { "_id" : 1, "name" : "Wag", "details" : { "type" : "Dog", "weight" : 20, "awards" : { "NZ Dog Award" : "Top Dog", "New York Marathon" : "Fastest Animal", "Sumo 2021" : "Biggest Dog" } } } '; SELECT JSON_SEARCH( @json, 'all', '%dog%', NULL, '$.details.awards' ) AS Result;Resultat:
+---------------------------------------------- -------------------+| Resultat |+----------------------------------------------- ------------------+| ["$.details.awards.NZ Dog Award", "$.details.awards.Sumo 2021"] |+------------------------ ------------------------------------------+I dette tilfælde er strengen
dogforekommer faktisk tre gange i dokumentet, men kun to gange under den angivne sti.Vi brugte også
NULLfor escape-tegnargumentet, hvilket resulterer i, at standard escape-tegnet bliver brugt, som er omvendt skråstreg (\).Standard Escape-tegn
Som standard er escape-tegnet en omvendt skråstreg (
\).Eksempel:
SET @json = '[ { "uid": "Wag", "pwd": "my%pwd" }, { "uid": "Bark", "pwd": "my%%%pwd" }, { "uid": "Bark", "pwd": "myBIGpwd" } ]'; SELECT JSON_SEARCH(@json, 'all', 'my%pwd') AS "Not Escaped", JSON_SEARCH(@json, 'all', 'my\%pwd') AS "Escaped";Resultat:
+---------------------------------------------+------- -----+| Ikke undsluppet | Undsluppet |+----------------------------------------------+-------- ----+| ["$[0].pwd", "$[1].pwd", "$[2].pwd"] | "$[0].pwd" |+---------------------------------------------+- -----------+Procenttegnet (
%) er et jokertegn, der matcher et vilkårligt antal tegn. Derfor, hvis vi ikke undslipper det, vil det matche et hvilket som helst antal tegn, inklusive tegn, der ikke er procenttegn.Men når vi escaper procenttegnet med escape-tegnet, vil det kun matche, når der er præcis ét procenttegn på den placering.
Ovenstående resultater afspejler dette.
Angiv et tilpasset escape-tegn
Du kan angive et brugerdefineret escape-tegn, hvis det kræves. For at gøre dette skal du angive det som det fjerde argument.
Eksempel:
SET @json = '[ { "uid": "Wag", "pwd": "my%pwd" }, { "uid": "Bark", "pwd": "my%%%pwd" }, { "uid": "Bark", "pwd": "myBIGpwd" } ]'; SELECT JSON_SEARCH(@json, 'all', 'my%pwd', '!') AS "Not Escaped", JSON_SEARCH(@json, 'all', 'my!%pwd', '!') AS "Escaped";Resultat:
+---------------------------------------------+------- -----+| Ikke undsluppet | Undsluppet |+----------------------------------------------+-------- ----+| ["$[0].pwd", "$[1].pwd", "$[2].pwd"] | "$[0].pwd" |+---------------------------------------------+- -----------+Så vi får det samme resultat som i det foregående eksempel. Den eneste forskel er, at vi specificerede en anden escape-karakter. I dette tilfælde specificerede vi, at udråbstegn (
!) er escape-karakteren.Nul-argumenter
Hvis nogen af søgestrengen, søgestrengen eller sti-argumenterne er
NULL, resultatet erNULL:SELECT JSON_SEARCH(null, 'all', 's', '', '$') AS a, JSON_SEARCH('{"a":1}', 'all', null, '', '$') AS b, JSON_SEARCH('{"a":1}', 'all', 's', '', null) AS c;Resultat:
+------+------+------+| en | b | c |+------+------+------+| NULL | NULL | NULL |+------+------+------+Forkert parameterantal
Angivelse af ingen argumenter resulterer i en fejl:
SELECT JSON_SEARCH();Resultat:
FEJL 1582 (42000):Forkert parameterantal i kaldet til den oprindelige funktion 'JSON_SEARCH'Det er det samme, når du giver for få argumenter:
SELECT JSON_SEARCH('{"a":1}', 'all');Resultat:
FEJL 1582 (42000):Forkert parameterantal i kaldet til den oprindelige funktion 'JSON_SEARCH'