Mysql
 sql >> Database >  >> RDS >> Mysql

JSON_SEARCH() – Trova il percorso di una stringa in un documento JSON in MySQL

In MySQL, il JSON_SEARCH() La funzione restituisce il percorso di una determinata stringa in un documento JSON.

Fornisci il documento JSON come argomento per la funzione. Fornisci anche l'argomento che determina la stringa effettiva da cercare (inclusi eventuali caratteri di escape), nonché una parola chiave per indicare se restituire il percorso di tutte le istanze o solo di una.

Sintassi

La sintassi è questa:

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

Segue la spiegazione di ogni argomento.

  • json_doc è il documento JSON da cercare
  • one_or_all è la parola chiave one o all . Se usi one , la ricerca viene interrotta una volta trovata la prima occorrenza. Cioè, la funzione restituisce solo il percorso della prima istanza della stringa di ricerca. Se all viene specificato, i percorsi di tutte le occorrenze vengono restituiti in modo tale da non includere percorsi duplicati. Se sono presenti più percorsi, vengono inseriti automaticamente come un array.
  • search_str è la stringa effettiva di cui restituire il percorso.
  • escape_char è un carattere opzionale da utilizzare come carattere di escape. Deve essere una costante vuota o un carattere. Se non specifichi questo argomento (o se è NULL), il carattere di escape è la barra rovesciata (\ ).
  • path è un argomento facoltativo per determinare dove inizia il percorso di "livello superiore" all'interno del documento JSON.

All'interno di search_str argomento, il % e _ i caratteri funzionano esattamente come se usati con LIKE operatore:% corrisponde a qualsiasi numero di caratteri (inclusi zero caratteri) e _ corrisponde esattamente a un carattere.

Per specificare un valore letterale % o _ carattere nella stringa di ricerca, anteponendolo al carattere di escape.

Esempio 1 – Utilizzo di base

Ecco un esempio da dimostrare.

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

Risultato:

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

Esempio 2 – Matrici

Ecco un esempio di ricerca di una stringa all'interno di un array.

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

Risultato:

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

Le matrici utilizzano la numerazione in base zero, quindi questo risultato indica il secondo elemento.

Esempio 3 – Stringa inesistente

Se specifichi una stringa che non esiste viene restituito un valore NULL.

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

Risultato:

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

Otterrai anche un valore NULL se uno qualsiasi dei json_doc , search_str o path gli argomenti sono NULL o se non esiste alcun percorso all'interno dell'oggetto JSON.

Esempio 4:occorrenze multiple di una stringa

Se il documento JSON contiene più occorrenze della stessa stringa, il risultato dipenderà dal fatto che tu specifichi one o all come secondo argomento.

Se usi one , viene restituita solo la prima occorrenza (supponendo che sia presente almeno un'occorrenza):

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

Risultato:

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

Se usi all , vengono restituiti i percorsi di tutte le occorrenze. Se sono presenti più percorsi, vengono inseriti automaticamente come array.

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

Risultato:

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

È inoltre possibile specificare un percorso che restituisca solo i risultati di un percorso specificato. Maggiori informazioni di seguito (sotto Esempio 8 – Specificare un percorso ).

Esempio 5 – Caratteri jolly

È possibile utilizzare caratteri jolly come specificato nella sintassi sopra. Ad esempio, puoi utilizzare il % per abbinare un numero qualsiasi di caratteri.

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

Risultato:

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

E puoi usare _ per abbinare un solo carattere.

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

Risultato:

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

Se dovessimo usare il _ nell'esempio precedente, otterremmo un risultato NULL.

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

Risultato:

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

Esempio 6 – Carattere di escape predefinito

Se devi cercare una stringa che contenga effettivamente uno dei caratteri jolly sopra, dovrai eseguire l'escape del carattere. Questo dice a MySQL di usarlo come una stringa letterale (invece di interpretarlo come un carattere jolly).

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

Risultato:

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

A prima vista, potresti pensare che la barra rovesciata non fosse necessaria, perché dopotutto otterremmo lo stesso risultato se lo facessimo:

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

Risultato:

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

Ma il problema con questo approccio è che otteniamo lo stesso risultato anche se facciamo questo:

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

Risultato:

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

Quindi la barra rovesciata informa MySQL che stiamo cercando solo una singola istanza di % come una stringa letterale e non per qualsiasi numero di altri caratteri.

Lo stesso concetto vale per il carattere di sottolineatura.

Se facciamo questo:

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

Otteniamo questo:

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

Entrambi gli approcci restituiscono lo stesso risultato.

Ma se lo facciamo (sostituiamo _ con J nell'id utente):

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

Otteniamo questo:

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

Esempio 7 – Carattere di escape personalizzato

È possibile specificare il proprio carattere di escape, se necessario. Puoi farlo includendolo come quarto argomento facoltativo.

Ecco l'esempio precedente riscritto per utilizzare un carattere di escape diverso (l'ID utente include un _ carattere).

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

Risultato:

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

E se sostituiamo il _ con J nell'ID utente:

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

Risultato:

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

Esempio 8:specificare un percorso

Puoi anche specificare un percorso da cui iniziare la ricerca. Ecco un esempio.

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

Risultato:

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

Se non avessimo specificato un percorso, otterremmo il seguente risultato.

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

Risultato:

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

Inoltre, se avessimo specificato one come secondo argomento (oltre a omettere l'argomento del percorso), finiremmo con il seguente.

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

Risultato:

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

Esempio 9 – Documento vuoto

Se il documento non contiene percorsi, otterrai un valore NULL.

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

Risultato:

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