Mysql
 sql >> Datenbank >  >> RDS >> Mysql

JSON_SEARCH() – Finden Sie den Pfad zu einer Zeichenfolge in einem JSON-Dokument in MySQL

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-Dokument
  • one_or_all ist das Schlüsselwort one oder all . Wenn Sie one 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. Wenn all 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 mit J 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 |+--------+