Mysql
 sql >> Baza danych >  >> RDS >> Mysql

JSON_SEARCH() – Znajdź ścieżkę do ciągu w dokumencie JSON w MySQL

W MySQL funkcja JSON_SEARCH() funkcja zwraca ścieżkę do danego ciągu w dokumencie JSON.

Podajesz dokument JSON jako argument funkcji. Podajesz również argument, który określa rzeczywisty ciąg do przeszukania (w tym wszelkie znaki ucieczki), a także słowo kluczowe wskazujące, czy zwrócić ścieżkę wszystkich wystąpień, czy tylko jednego.

Składnia

Składnia wygląda tak:

JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] ...])

Wyjaśnienie każdego argumentu następuje.

  • json_doc jest dokumentem JSON do przeszukania
  • one_or_all to słowo kluczowe one lub all . Jeśli używasz one , wyszukiwanie zostanie zatrzymane po znalezieniu pierwszego wystąpienia. Oznacza to, że funkcja zwraca tylko ścieżkę pierwszego wystąpienia ciągu wyszukiwania. Jeśli all jest określony, ścieżki wszystkich wystąpień są zwracane w taki sposób, że nie są uwzględniane zduplikowane ścieżki. Jeśli istnieje wiele ścieżek, są one automatycznie zawijane jako tablica.
  • search_str jest rzeczywistym ciągiem, do którego ma zostać zwrócona ścieżka.
  • escape_char jest opcjonalnym znakiem używanym jako znak ucieczki. Musi to być pusta stała lub jeden znak. Jeśli nie określisz tego argumentu (lub jeśli ma on wartość NULL), znakiem zmiany znaczenia jest ukośnik odwrotny (\ ).
  • path jest opcjonalnym argumentem określającym, gdzie zaczyna się ścieżka „najwyższego poziomu” w dokumencie JSON.

W search_str argument, % i _ znaki działają tak samo, jak używane z LIKE operator:% pasuje do dowolnej liczby znaków (łącznie ze znakami zero) i _ pasuje dokładnie do jednego znaku.

Aby określić dosłowny % lub _ w wyszukiwanym ciągu, poprzedź go znakiem ucieczki.

Przykład 1 – Podstawowe użycie

Oto przykład do zademonstrowania.

SELECT 
  JSON_SEARCH('{"Name": "Bart", "Age": 10}', 'one', 'Bart') Result;

Wynik:

+----------+
| Result   |
+----------+
| "$.Name" |
+----------+

Przykład 2 – Tablice

Oto przykład znajdowania ciągu w tablicy.

SET @doc = '{"Name": "Bart", "Hobbies": ["Skateboarding", "Mischief"]}';
SELECT JSON_SEARCH(@doc, 'one', 'Mischief') Result;

Wynik:

+----------------+
| Result         |
+----------------+
| "$.Hobbies[1]" |
+----------------+

Tablice używają numeracji od zera, więc ten wynik wskazuje drugi element.

Przykład 3 – nieistniejący ciąg

Jeśli określisz ciąg, który nie istnieje, zwracana jest wartość NULL.

SET @doc = '{"Name": "Bart", "Hobbies": ["Skateboarding", "Mischief"]}';
SELECT JSON_SEARCH(@doc, 'one', 'Homer') Result;

Wynik:

+--------+
| Result |
+--------+
| NULL   |
+--------+

Otrzymasz również wartość NULL, jeśli którykolwiek z json_doc , search_str lub path argumenty są NULL lub jeśli w obiekcie JSON nie ma ścieżki.

Przykład 4 – Wiele wystąpień ciągu

Jeśli dokument JSON zawiera wiele wystąpień tego samego ciągu, wynik będzie zależał od tego, czy określisz one lub all jako drugi argument.

Jeśli używasz one , zwracane jest tylko pierwsze wystąpienie (zakładając, że istnieje co najmniej jedno wystąpienie):

SET @doc = '{"Name": "Bart", "Friends": ["Bart", "Milhouse"]}';
SELECT JSON_SEARCH(@doc, 'one', 'Bart') Result;

Wynik:

+----------+
| Result   |
+----------+
| "$.Name" |
+----------+

Jeśli używasz all , zwracane są ścieżki wszystkich wystąpień. Jeśli istnieje więcej niż jedna ścieżka, są one automatycznie zawijane jako tablica.

SET @doc = '{"Name": "Bart", "Friends": ["Bart", "Milhouse"]}';
SELECT JSON_SEARCH(@doc, 'all', 'Bart') Result;

Wynik:

+----------------------------+
| Result                     |
+----------------------------+
| ["$.Name", "$.Friends[0]"] |
+----------------------------+

Możesz również określić ścieżkę, która zwraca tylko wyniki z określonej ścieżki. Więcej na ten temat poniżej (w Przykładzie 8 – Określ ścieżkę ).

Przykład 5 – Symbole wieloznaczne

Możesz używać symboli wieloznacznych zgodnie z powyższą składnią. Na przykład możesz użyć % aby dopasować dowolną liczbę znaków.

SET @doc = '{"Name": "Bart", "Hobbies": ["Skateboarding", "Mischief"]}';
SELECT JSON_SEARCH(@doc, 'one', 'Skate%') Result;

Wynik:

+----------------+
| Result         |
+----------------+
| "$.Hobbies[0]" |
+----------------+

I możesz użyć _ aby dopasować tylko jeden znak.

SET @doc = '{"Name": "Bart", "Hobbies": ["Skateboarding", "Mischief"]}';
SELECT JSON_SEARCH(@doc, 'one', 'Bar_') Result;

Wynik:

+----------+
| Result   |
+----------+
| "$.Name" |
+----------+

Gdybyśmy mieli użyć _ w poprzednim przykładzie otrzymalibyśmy wynik NULL.

SET @doc = '{"Name": "Bart", "Hobbies": ["Skateboarding", "Mischief"]}';
SELECT JSON_SEARCH(@doc, 'one', 'Skate_') Result;

Wynik:

+--------+
| Result |
+--------+
| NULL   |
+--------+

Przykład 6 – Domyślny znak ucieczki

Jeśli chcesz wyszukać ciąg, który faktycznie zawiera którykolwiek z powyższych znaków wieloznacznych, musisz zmienić znaczenie znaku. To mówi MySQL, aby używał go jako literału ciągu (zamiast interpretować go jako symbol wieloznaczny).

SET @doc = '{"userid": "bart_simpson", "pwd": "pass%word"}';
SELECT JSON_SEARCH(@doc, 'one', 'pass\%word') Result;

Wynik:

+---------+
| Result  |
+---------+
| "$.pwd" |
+---------+

Na pierwszy rzut oka możesz pomyśleć, że odwrotny ukośnik był niepotrzebny, ponieważ w końcu otrzymalibyśmy ten sam wynik, jeśli zrobimy to:

SET @doc = '{"userid": "bart_simpson", "pwd": "pass%word"}';
SELECT JSON_SEARCH(@doc, 'one', 'pass%word') Result;

Wynik:

+---------+
| Result  |
+---------+
| "$.pwd" |
+---------+

Ale problem z tym podejściem polega na tym, że otrzymamy ten sam wynik, jeśli zrobimy to:

SET @doc = '{"userid": "bart_simpson", "pwd": "pass%BLAH-BLAH-BLAH-word"}';
SELECT JSON_SEARCH(@doc, 'one', 'pass%word') 'Result';

Wynik:

+---------+
| Result  |
+---------+
| "$.pwd" |
+---------+

Tak więc odwrotny ukośnik informuje MySQL, że szukamy tylko jednej instancji % jako literał ciągu, a nie dla dowolnej liczby innych znaków.

Ta sama koncepcja dotyczy znaku podkreślenia.

Jeśli to zrobimy:

SET @doc = '{"userid": "bart_simpson", "pwd": "pass%word"}';
SELECT 
  JSON_SEARCH(@doc, 'one', 'bart\_simpson') 'Escaped',
  JSON_SEARCH(@doc, 'one', 'bart_simpson') 'Not Escaped';

Otrzymujemy to:

+------------+-------------+
| Escaped    | Not Escaped |
+------------+-------------+
| "$.userid" | "$.userid"  |
+------------+-------------+

Oba podejścia zwracają ten sam wynik.

Ale jeśli to zrobimy (zamień _ na J w identyfikatorze użytkownika):

SET @doc = '{"userid": "bartJsimpson", "pwd": "pass%word"}';
SELECT 
  JSON_SEARCH(@doc, 'one', 'bart\_simpson') 'Escaped',
  JSON_SEARCH(@doc, 'one', 'bart_simpson') 'Not Escaped';

Otrzymujemy to:

+---------+-------------+
| Escaped | Not Escaped |
+---------+-------------+
| NULL    | "$.userid"  |
+---------+-------------+

Przykład 7 – Niestandardowa postać ucieczki

W razie potrzeby możesz określić własny znak ucieczki. Robisz to, dołączając go jako opcjonalny czwarty argument.

Oto poprzedni przykład przepisany tak, aby używał innego znaku ucieczki (identyfikator użytkownika zawiera _ znak).

SET @doc = '{"userid": "bart_simpson", "pwd": "pass%word"}';
SELECT 
  JSON_SEARCH(@doc, 'one', 'bart$_simpson', '$') 'Escaped',
  JSON_SEARCH(@doc, 'one', 'bart_simpson') 'Not Escaped';

Wynik:

+------------+-------------+
| Escaped    | Not Escaped |
+------------+-------------+
| "$.userid" | "$.userid"  |
+------------+-------------+

A jeśli zastąpimy _ z J w identyfikatorze użytkownika:

SET @doc = '{"userid": "bartJsimpson", "pwd": "pass%word"}';
SELECT 
  JSON_SEARCH(@doc, 'one', 'bart$_simpson', '$') 'Escaped',
  JSON_SEARCH(@doc, 'one', 'bart_simpson') 'Not Escaped';

Wynik:

+---------+-------------+
| Escaped | Not Escaped |
+---------+-------------+
| NULL    | "$.userid"  |
+---------+-------------+

Przykład 8 – Określ ścieżkę

Możesz także określić ścieżkę, od której chcesz rozpocząć wyszukiwanie. Oto przykład.

SET @data = '{  
    "Person": {    
       "Name": "Bart", 
       "Age": 10,
       "Friends": ["Bart", "Milhouse"]  
    }
 }';
SELECT JSON_SEARCH(@data, 'all', 'Bart', NULL, '$.Person.Friends') AS 'Result';

Wynik:

+-----------------------+
| Result                |
+-----------------------+
| "$.Person.Friends[0]" |
+-----------------------+

Gdybyśmy nie określili ścieżki, otrzymalibyśmy następujący wynik.

SET @data = '{  
    "Person": {    
       "Name": "Bart", 
       "Age": 10,
       "Friends": ["Bart", "Milhouse"]  
    }
 }';
SELECT JSON_SEARCH(@data, 'all', 'Bart') AS 'Result';

Wynik:

+------------------------------------------+
| Result                                   |
+------------------------------------------+
| ["$.Person.Name", "$.Person.Friends[0]"] |
+------------------------------------------+

Ponadto, gdybyśmy określili one jako drugi argument (pomijając argument ścieżki), otrzymalibyśmy następujący.

SET @data = '{  
    "Person": {    
       "Name": "Bart", 
       "Age": 10,
       "Friends": ["Bart", "Milhouse"]  
    }
 }';
SELECT JSON_SEARCH(@data, 'one', 'Bart') AS 'Result';

Wynik:

+-----------------+
| Result          |
+-----------------+
| "$.Person.Name" |
+-----------------+

Przykład 9 – Pusty dokument

Jeśli dokument nie zawiera ścieżek, otrzymasz wartość NULL.

SELECT 
  JSON_SEARCH('{}', 'all', 'Bart') 'Result';

Wynik:

+--------+
| Result |
+--------+
| NULL   |
+--------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd w MySQL podczas ustawiania domyślnej wartości DATE lub DATETIME

  2. jak usunąć zduplikowane wiersze z tabeli w mysql

  3. Jak włączyć SSL/TLS dla MySQL w Ubuntu?

  4. Używasz warstwy bazy danych Django poza Django?

  5. Architektura dla bezpieczeństwa:przewodnik po MySQL