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_doc
er JSON-dokumentet ogsearch_str
er strengen.return_arg
er søgeordetone
ellerall
. 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). Hvisall
er angivet, returneres stierne til alle forekomster. Hvis der er flere stier, pakkes de automatisk som en matrix.escape_char
argument er et valgfrit tegn, der skal bruges som et escape-tegn.path
argument 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
all
i stedet forone
for 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
all
tilone
, 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
dog
forekommer faktisk tre gange i dokumentet, men kun to gange under den angivne sti.Vi brugte også
NULL
for 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'