In MySQL der JSON_SEARCH()
Funktion gibt den Pfad zu einer gegebenen Zeichenfolge in einem JSON-Dokument zurück.
Sie stellen das JSON-Dokument als Argument für die Funktion bereit. Sie geben auch das Argument an, das die tatsächlich zu durchsuchende Zeichenfolge bestimmt (einschließlich aller Escape-Zeichen), sowie ein Schlüsselwort, um anzugeben, ob der Pfad aller Instanzen oder nur einer zurückgegeben werden soll.
Syntax
Die Syntax lautet wie folgt:
JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] ...])
Erklärung jedes Arguments folgt.
json_doc
ist das zu durchsuchende JSON-Dokumentone_or_all
ist das Schlüsselwortone
oderall
. Wenn Sieone
verwenden , wird die Suche beendet, sobald das erste Vorkommen gefunden wird. Das heißt, die Funktion gibt nur den Pfad der ersten Instanz der Suchzeichenfolge zurück. Wennall
angegeben ist, werden die Pfade aller Vorkommen so zurückgegeben, dass keine doppelten Pfade enthalten sind. Wenn mehrere Pfade vorhanden sind, werden sie automatisch als Array umbrochen.search_str
ist der eigentliche String, dessen Pfad zurückgegeben werden soll.escape_char
ist ein optionales Zeichen, das als Escape-Zeichen verwendet werden kann. Es muss eine leere Konstante oder ein Zeichen sein. Wenn Sie dieses Argument nicht angeben (oder wenn es NULL ist), ist das Escape-Zeichen der umgekehrte Schrägstrich (\
).path
ist ein optionales Argument, um zu bestimmen, wo der „oberste“ Pfad innerhalb des JSON-Dokuments beginnt.
Innerhalb der search_str
Argument, der %
und _
Zeichen funktionieren genau so, wie sie es tun, wenn sie mit LIKE
verwendet werden Operator:%
entspricht einer beliebigen Anzahl von Zeichen (einschließlich Nullzeichen) und _
entspricht genau einem Zeichen.
Um ein Literal %
anzugeben oder _
Zeichen in der Suchzeichenfolge, stellen Sie ihm das Escape-Zeichen voran.
Beispiel 1 – Grundlegende Verwendung
Hier ist ein Beispiel zur Veranschaulichung.
SELECT JSON_SEARCH('{"Name":"Bart", "Alter":10}', 'one', 'Bart') Ergebnis;
Ergebnis:
+----------+| Ergebnis |+----------+| "$.Name" |+----------+
Beispiel 2 – Arrays
Hier ist ein Beispiel für die Suche nach einer Zeichenfolge in einem Array.
SET @doc ='{"Name":"Bart", "Hobbies":["Skateboarding", "Mischief"]}';SELECT JSON_SEARCH(@doc, 'one', 'Mischief') Result;
Ergebnis:
+----------------+| Ergebnis |+----------------+| "$.Hobbys[1]" |+----------------+
Arrays verwenden eine nullbasierte Nummerierung, daher gibt dieses Ergebnis das zweite Element an.
Beispiel 3 – Nicht vorhandene Zeichenfolge
Wenn Sie eine Zeichenfolge angeben, die nicht existiert, wird ein NULL-Wert zurückgegeben.
SET @doc ='{"Name":"Bart", "Hobbies":["Skateboarding", "Mischief"]}';SELECT JSON_SEARCH(@doc, 'one', 'Homer') Result;
Ergebnis:
+--------+| Ergebnis |+--------+| NULL |+--------+
Sie erhalten auch einen NULL-Wert, falls einer der json_doc
, search_str
, oder path
Argumente sind NULL
oder wenn kein Pfad innerhalb des JSON-Objekts existiert.
Beispiel 4 – Mehrfaches Vorkommen eines Strings
Wenn das JSON-Dokument mehrere Vorkommen derselben Zeichenfolge enthält, hängt das Ergebnis davon ab, ob Sie one
angeben oder all
als zweites Argument.
Wenn Sie one
verwenden , wird nur das erste Vorkommen zurückgegeben (vorausgesetzt, es gibt mindestens ein Vorkommen):
SET @doc ='{"Name":"Bart", "Friends":["Bart", "Milhouse"]}';SELECT JSON_SEARCH(@doc, 'one', 'Bart') Ergebnis;
Ergebnis:
+----------+| Ergebnis |+----------+| "$.Name" |+----------+
Wenn Sie all
verwenden , werden die Pfade aller Vorkommen zurückgegeben. Wenn es mehr als einen Pfad gibt, werden sie automatisch als Array umbrochen.
SET @doc ='{"Name":"Bart", "Friends":["Bart", "Milhouse"]}';SELECT JSON_SEARCH(@doc, 'all', 'Bart') Ergebnis;
Ergebnis:
+-----------------------------------+| Ergebnis |+------------------------------------+| ["$.Name", "$.Freunde[0]"] |+------------------------------------+
Sie können auch einen Pfad angeben, der nur die Ergebnisse aus einem angegebenen Pfad zurückgibt. Mehr dazu weiter unten (unter Beispiel 8 – Pfad angeben). ).
Beispiel 5 – Platzhalter
Sie können Platzhalterzeichen wie in der obigen Syntax angegeben verwenden. Beispielsweise können Sie den %
verwenden um eine beliebige Anzahl von Zeichen zu finden.
SET @doc ='{"Name":"Bart", "Hobbies":["Skateboarding", "Mischief"]}';SELECT JSON_SEARCH(@doc, 'one', 'Skate%') Ergebnis;
Ergebnis:
+----------------+| Ergebnis |+----------------+| "$.Hobbys[0]" |+----------------+
Und Sie können _
verwenden um nur ein Zeichen zu finden.
SET @doc ='{"Name":"Bart", "Hobbies":["Skateboarding", "Mischief"]}';SELECT JSON_SEARCH(@doc, 'one', 'Bar_') Result;
Ergebnis:
+----------+| Ergebnis |+----------+| "$.Name" |+----------+
Wenn wir den _
verwenden würden im vorherigen Beispiel würden wir ein NULL-Ergebnis erhalten.
SET @doc ='{"Name":"Bart", "Hobbies":["Skateboarding", "Mischief"]}';SELECT JSON_SEARCH(@doc, 'one', 'Skate_') Ergebnis;
Ergebnis:
+--------+| Ergebnis |+--------+| NULL |+--------+
Beispiel 6 – Standard-Escape-Zeichen
Wenn Sie nach einer Zeichenfolge suchen müssen, die tatsächlich eines der oben genannten Platzhalterzeichen enthält, müssen Sie das Zeichen maskieren. Das weist MySQL an, es als String-Literal zu verwenden (anstatt es als Platzhalterzeichen zu interpretieren).
SET @doc ='{"userid":"bart_simpson", "pwd":"pass%word"}';SELECT JSON_SEARCH(@doc, 'one', 'pass\%word') Ergebnis;Ergebnis:
+---------+| Ergebnis |+---------+| "$.pwd" |+---------+Auf den ersten Blick denken Sie vielleicht, dass der Backslash unnötig war, denn schließlich würden wir dasselbe Ergebnis erhalten, wenn wir dies tun:
SET @doc ='{"userid":"bart_simpson", "pwd":"pass%word"}';SELECT JSON_SEARCH(@doc, 'one', 'pass%word') Ergebnis;Ergebnis:
+---------+| Ergebnis |+---------+| "$.pwd" |+---------+Das Problem bei diesem Ansatz ist jedoch, dass wir dasselbe Ergebnis erhalten, wenn wir Folgendes tun:
SET @doc ='{"userid":"bart_simpson", "pwd":"pass%BLAH-BLAH-BLAH-word"}';SELECT JSON_SEARCH(@doc, 'one', 'pass%word' ) 'Ergebnis';Ergebnis:
+---------+| Ergebnis |+---------+| "$.pwd" |+---------+Der umgekehrte Schrägstrich informiert MySQL also darüber, dass wir nur nach einer einzigen Instanz von
%
suchen als String-Literal und nicht für beliebig viele andere Zeichen.Das gleiche Konzept gilt für den Unterstrich.
Wenn wir dies tun:
SET @doc ='{"userid":"bart_simpson", "pwd":"pass%word"}';SELECT JSON_SEARCH(@doc, 'one', 'bart\_simpson') 'Escaped', JSON_SEARCH (@doc, 'one', 'bart_simpson') 'Not Escape';Wir bekommen das:
+------------+-------------+| Entflohen | Nicht mit Escapezeichen versehen |+-----------+------------+| "$.Benutzer-ID" | "$.Benutzer-ID" |+-----------+------------+Beide Ansätze liefern dasselbe Ergebnis.
Aber wenn wir das tun (ersetzen Sie das _ durch J in der Benutzer-ID):
SET @doc ='{"userid":"bartJsimpson", "pwd":"pass%word"}';SELECT JSON_SEARCH(@doc, 'one', 'bart\_simpson') 'Escaped', JSON_SEARCH (@doc, 'one', 'bart_simpson') 'Not Escape';Wir bekommen das:
+---------+------------+| Entflohen | Nicht maskiert |+---------+---------------------+| NULL | "$.userid" |+---------+------------+Beispiel 7 – Benutzerdefiniertes Escape-Zeichen
Sie können bei Bedarf ein eigenes Escape-Zeichen angeben. Dazu fügen Sie es als optionales viertes Argument hinzu.
Hier ist das vorherige Beispiel umgeschrieben, um ein anderes Escape-Zeichen zu verwenden (die Benutzer-ID enthält einen
_
Zeichen).SET @doc ='{"userid":"bart_simpson", "pwd":"pass%word"}';SELECT JSON_SEARCH(@doc, 'one', 'bart$_simpson', '$') ' Escaped', JSON_SEARCH(@doc, 'one', 'bart_simpson') 'Not Escaped';Ergebnis:
+------------+-------------+| Entflohen | Nicht mit Escapezeichen versehen |+-----------+------------+| "$.Benutzer-ID" | "$.Benutzer-ID" |+-----------+------------+Und wenn wir den
_
ersetzen mitJ
in der Benutzerkennung:SET @doc ='{"userid":"bartJsimpson", "pwd":"pass%word"}';SELECT JSON_SEARCH(@doc, 'one', 'bart$_simpson', '$') ' Escaped', JSON_SEARCH(@doc, 'one', 'bart_simpson') 'Not Escaped';Ergebnis:
+---------+------------+| Entflohen | Nicht maskiert |+---------+---------------------+| NULL | "$.userid" |+---------+------------+Beispiel 8 – Geben Sie einen Pfad an
Sie können auch einen Pfad angeben, von dem aus die Suche beginnen soll. Hier ist ein Beispiel.
SET @data ='{ "Person":{ "Name":"Bart", "Alter":10, "Freunde":["Bart", "Milhouse"] } }';SELECT JSON_SEARCH(@data , 'all', 'Bart', NULL, '$.Person.Friends') AS 'Result';Ergebnis:
+-----------------------+| Ergebnis |+-----------------------+| "$.Person.Freunde[0]" |+----------------------+Wenn wir keinen Pfad angegeben hätten, würden wir das folgende Ergebnis erhalten.
SET @data ='{ "Person":{ "Name":"Bart", "Alter":10, "Freunde":["Bart", "Milhouse"] } }';SELECT JSON_SEARCH(@data , 'alle', 'Bart') AS 'Ergebnis';Ergebnis:
+--------------------------------------------------+| Ergebnis |+--------------------------------------------------+| ["$.Person.Name", "$.Person.Freunde[0]"] |+------------------------------------ --------------+Außerdem, wenn wir
one
angegeben hätten Als zweites Argument (sowie durch Weglassen des Pfadarguments) würden wir am Ende Folgendes erhalten.SET @data ='{ "Person":{ "Name":"Bart", "Alter":10, "Freunde":["Bart", "Milhouse"] } }';SELECT JSON_SEARCH(@data , 'eins', 'Bart') AS 'Ergebnis';Ergebnis:
+----------------+| Ergebnis |+----------------+| "$.Person.Name" |+----------------+Beispiel 9 – Leeres Dokument
Wenn das Dokument keine Pfade enthält, erhalten Sie einen NULL-Wert.
SELECT JSON_SEARCH('{}', 'all', 'Bart') 'Ergebnis';Ergebnis:
+--------+| Ergebnis |+--------+| NULL |+--------+