In MariaDB, JSON_SEARCH()
is een ingebouwde functie waarmee u het pad naar een bepaalde waarde in een JSON-document kunt krijgen.
Het accepteert het JSON-document en een tekenreeks als argumenten en retourneert het pad naar de opgegeven tekenreeks in het document.
Syntaxis
De syntaxis gaat als volgt:
JSON_SEARCH(
json_doc,
return_arg,
search_str[, escape_char[, path] ...]
)
Waar:
json_doc
is het JSON-document ensearch_str
is de tekenreeks.return_arg
is het sleutelwoordone
ofall
. Als uone
. gebruikt , wordt alleen het eerste pad geretourneerd. Alle andere gebeurtenissen worden genegeerd. Welk pad als "eerste" wordt beschouwd, is niet gedefinieerd (volgens de MariaDB-documentatie). Alsall
is opgegeven, worden de paden van alle exemplaren geretourneerd. Als er meerdere paden zijn, worden ze automatisch ingepakt als een array.- De
escape_char
argument is een optioneel teken om als escape-teken te gebruiken. - Het
path
argument is een optioneel argument om te bepalen waar het pad op het hoogste niveau begint in het JSON-document.
Voorbeeld
Hier is een voorbeeld om te demonstreren:
SET @json = '
{
"name" : "Wag",
"type" : "Dog"
}';
SELECT JSON_SEARCH(@json, 'one', 'Wag');
Resultaat:
+----------------------------------+ | JSON_SEARCH(@json, 'one', 'Wag') | +----------------------------------+ | "$.name" | +----------------------------------+
Hier is een voorbeeld van het retourneren van het pad voor een element in een array:
SET @json = '
{
"product" : "Left Handed Screwdriver",
"sizes" : [ "Small", "Medium", "Large" ],
}';
SELECT JSON_SEARCH(@json, 'one', 'Medium');
Resultaat:
+-------------------------------------+ | JSON_SEARCH(@json, 'one', "Medium") | +-------------------------------------+ | "$.sizes[1]" | +-------------------------------------+
Arrays zijn gebaseerd op nul, en dus $.sizes[1]
verwijst naar het tweede element in de array.
Meerdere gebeurtenissen
Als u alle paden wilt retourneren die de tekenreeks bevatten, gebruikt u all
in plaats van one
voor het tweede 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');
Resultaat:
+----------------------------------+ | JSON_SEARCH(@json, 'all', "Dog") | +----------------------------------+ | ["$[0].type", "$[1].type"] | +----------------------------------+
Als we all
veranderen naar one
, dit is wat er gebeurt:
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');
Resultaat:
+----------------------------------+ | JSON_SEARCH(@json, 'one', "Dog") | +----------------------------------+ | "$[0].type" | +----------------------------------+
Er wordt slechts één pad geretourneerd.
Geef een pad op
Hier is een voorbeeld dat een pad specificeert waarnaar in het document moet worden gezocht:
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;
Resultaat:
+-----------------------------------------------------------------+ | Result | +-----------------------------------------------------------------+ | ["$.details.awards.NZ Dog Award", "$.details.awards.Sumo 2021"] | +-----------------------------------------------------------------+
In dit geval is de string dog
komt eigenlijk drie keer voor in het document, maar slechts twee keer onder het opgegeven pad.
We gebruikten ook NULL
voor het escape-tekenargument, wat ertoe leidt dat het standaard escape-teken wordt gebruikt, namelijk de backslash (\
).
Standaard Escape-teken
Het escape-teken is standaard een backslash (\
).
Voorbeeld:
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";
Resultaat:
+--------------------------------------+------------+ | Not Escaped | Escaped | +--------------------------------------+------------+ | ["$[0].pwd", "$[1].pwd", "$[2].pwd"] | "$[0].pwd" | +--------------------------------------+------------+
Het procentteken (%
) is een jokerteken dat overeenkomt met een willekeurig aantal tekens. Daarom, als we er niet aan ontsnappen, zal het overeenkomen met een willekeurig aantal tekens, inclusief tekens die geen percentagetekens zijn.
Maar wanneer we ontsnappen aan het percentageteken met het escape-teken, komt het alleen overeen als er precies één procentteken op die locatie staat.
De bovenstaande resultaten weerspiegelen dit.
Geef een aangepast escape-teken op
U kunt indien nodig een aangepast escape-teken opgeven. Om dit te doen, geeft u het op als het vierde argument.
Voorbeeld:
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";
Resultaat:
+--------------------------------------+------------+ | Not Escaped | Escaped | +--------------------------------------+------------+ | ["$[0].pwd", "$[1].pwd", "$[2].pwd"] | "$[0].pwd" | +--------------------------------------+------------+
We krijgen dus hetzelfde resultaat als in het vorige voorbeeld. Het enige verschil is dat we een ander escape-teken hebben opgegeven. In dit geval hebben we gespecificeerd dat het uitroepteken (!
) is het escape-teken.
Nullargumenten
Als een van de zoektekenreeksen, zoekreeksen of padargumenten NULL
. is , het resultaat is NULL
:
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;
Resultaat:
+------+------+------+ | a | b | c | +------+------+------+ | NULL | NULL | NULL | +------+------+------+
Onjuist aantal parameters
Het verstrekken van geen argumenten resulteert in een fout:
SELECT JSON_SEARCH();
Resultaat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_SEARCH'
Hetzelfde geldt als je te weinig argumenten geeft:
SELECT JSON_SEARCH('{"a":1}', 'all');
Resultaat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_SEARCH'