In MariaDB, JSON_SEARCH()
ist eine integrierte Funktion, mit der Sie den Pfad zu einem bestimmten Wert in einem JSON-Dokument abrufen können.
Es akzeptiert das JSON-Dokument und eine Zeichenfolge als Argumente und gibt den Pfad zu der angegebenen Zeichenfolge innerhalb des Dokuments zurück.
Syntax
Die Syntax sieht so aus:
JSON_SEARCH(
json_doc,
return_arg,
search_str[, escape_char[, path] ...]
)
Wo:
json_doc
ist das JSON-Dokument undsearch_str
ist die Zeichenfolge.return_arg
ist das Schlüsselwortone
oderall
. Wenn Sieone
verwenden , wird nur der erste Pfad zurückgegeben. Alle anderen Vorkommnisse werden ignoriert. Welcher Pfad als „erster“ betrachtet wird, ist undefiniert (laut MariaDB-Dokumentation). Wennall
angegeben ist, werden die Pfade aller Vorkommen zurückgegeben. Wenn mehrere Pfade vorhanden sind, werden sie automatisch als Array umbrochen.- Das
escape_char
argument ist ein optionales Zeichen, das als Escape-Zeichen verwendet werden kann. - Der
path
Argument ist ein optionales Argument, um zu bestimmen, wo der „Top-Level“-Pfad innerhalb des JSON-Dokuments beginnt.
Beispiel
Hier ist ein Beispiel zur Veranschaulichung:
SET @json = '
{
"name" : "Wag",
"type" : "Dog"
}';
SELECT JSON_SEARCH(@json, 'one', 'Wag');
Ergebnis:
+----------------------------------------------+| JSON_SEARCH(@json, 'one', 'Wag') |+-----------------------------------------------+ | "$.name" |+---------------------------------+
Hier ist ein Beispiel für die Rückgabe des Pfads für ein Element in einem Array:
SET @json = '
{
"product" : "Left Handed Screwdriver",
"sizes" : [ "Small", "Medium", "Large" ],
}';
SELECT JSON_SEARCH(@json, 'one', 'Medium');
Ergebnis:
+-------------------------------------+| JSON_SEARCH(@json, 'one', "Medium") |+----------------------------------- --+| "$.Größen[1]" |+------------------------------------+Arrays sind nullbasiert, also
$.sizes[1]
bezieht sich auf das zweite Element im Array.Mehrere Vorkommen
Wenn Sie alle Pfade zurückgeben möchten, die die Zeichenfolge enthalten, verwenden Sie
all
stattone
für das zweite 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');
Ergebnis:
+----------------------------------------------+| JSON_SEARCH(@json, 'all', "Hund") |+------------------------------------------------+ | ["$[0].type", "$[1].type"] |+------------------------------------- -----+Wenn wir
all
ändern zuone
, Folgendes passiert: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');
Ergebnis:
+----------------------------------------------+| JSON_SEARCH(@json, 'one', "Hund") |+-----------------------------------------------+ | "$[0].type" |+---------------------------------+Es wird nur ein Pfad zurückgegeben.
Geben Sie einen Pfad an
Hier ist ein Beispiel, das einen Pfad angibt, nach dem im Dokument gesucht werden soll:
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;
Ergebnis:
+---------------------------------------------- -------------------+| Ergebnis |+------------------------------------------------------------ ------------------+| ["$.details.awards.NZ Dog Award", "$.details.awards.Sumo 2021"] |+------------------------ -----------------------------------------+
In diesem Fall die Zeichenfolge dog
tatsächlich dreimal innerhalb des Dokuments vorkommt, aber nur zweimal unterhalb des angegebenen Pfads.
Außerdem haben wir NULL
verwendet für das Escape-Zeichen-Argument, was dazu führt, dass das standardmäßige Escape-Zeichen verwendet wird, nämlich der umgekehrte Schrägstrich (\
).
Standard-Escape-Zeichen
Standardmäßig ist das Escape-Zeichen ein umgekehrter Schrägstrich (\
).
Beispiel:
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";
Ergebnis:
+-------------------------------------+------- -----+| Nicht entkommen | Entkommen |+--------------------------------------+-------- ----+| ["$[0].pwd", "$[1].pwd", "$[2].pwd"] | "$[0].pwd" |+--------------------------------------+- -----------+
Das Prozentzeichen (%
) ist ein Platzhalterzeichen, das einer beliebigen Anzahl von Zeichen entspricht. Wenn wir es also nicht maskieren, stimmt es mit einer beliebigen Anzahl von Zeichen überein, einschließlich Zeichen, die keine Prozentzeichen sind.
Aber wenn wir das Prozentzeichen mit dem Escape-Zeichen maskieren, wird es nur übereinstimmen, wenn genau ein Prozentzeichen an dieser Stelle vorhanden ist.
Die obigen Ergebnisse spiegeln dies wider.
Geben Sie ein benutzerdefiniertes Escape-Zeichen an
Sie können bei Bedarf ein benutzerdefiniertes Escape-Zeichen angeben. Geben Sie es dazu als viertes Argument an.
Beispiel:
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";
Ergebnis:
+-------------------------------------+------- -----+| Nicht entkommen | Entkommen |+--------------------------------------+-------- ----+| ["$[0].pwd", "$[1].pwd", "$[2].pwd"] | "$[0].pwd" |+--------------------------------------+- -----------+
Wir erhalten also das gleiche Ergebnis wie im vorherigen Beispiel. Der einzige Unterschied besteht darin, dass wir ein anderes Escape-Zeichen angegeben haben. In diesem Fall haben wir angegeben, dass das Ausrufezeichen (!
) ist das Fluchtzeichen.
Null-Argumente
Wenn eines der Suchzeichenfolge-, Suchzeichenfolge- oder Pfadargumente NULL
ist , ist das Ergebnis 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;
Ergebnis:
+------+------+------+| ein | b | c |+------+------+------+| NULL | NULL | NULL |+------+------+------+
Falsche Parameteranzahl
Wenn Sie keine Argumente angeben, wird ein Fehler ausgegeben:
SELECT JSON_SEARCH();
Ergebnis:
FEHLER 1582 (42000):Falsche Parameteranzahl im Aufruf der nativen Funktion „JSON_SEARCH“
Das Gleiche gilt, wenn Sie zu wenige Argumente angeben:
SELECT JSON_SEARCH('{"a":1}', 'all');
Ergebnis:
FEHLER 1582 (42000):Falsche Parameteranzahl im Aufruf der nativen Funktion „JSON_SEARCH“