MariaDB
 sql >> Database >  >> RDS >> MariaDB

Spiegazione di MariaDB JSON_SEARCH()

In MariaDB, JSON_SEARCH() è una funzione integrata che ti consente di ottenere il percorso di un determinato valore in un documento JSON.

Accetta il documento JSON e una stringa come argomenti e restituisce il percorso alla stringa data all'interno del documento.

Sintassi

La sintassi è questa:

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

Dove:

  • json_doc è il documento JSON e search_str è la stringa.
  • return_arg è la parola chiave one o all . Se usi one , viene restituito solo il primo percorso. Eventuali altre occorrenze vengono ignorate. Quale percorso è considerato "primo" non è definito (secondo la documentazione di MariaDB). Se all viene specificato, vengono restituiti i percorsi di tutte le occorrenze. Se sono presenti più percorsi, vengono inseriti automaticamente come un array.
  • Il escape_char argomento è un carattere opzionale da usare come carattere di escape.
  • Il path argomento è un argomento facoltativo per determinare dove inizia il percorso di "livello superiore" all'interno del documento JSON.

Esempio

Ecco un esempio da dimostrare:

SET @json = '
    { 
        "name" : "Wag", 
        "type" : "Dog" 
    }';

SELECT JSON_SEARCH(@json, 'one', 'Wag');

Risultato:

+----------------------------------+
| JSON_SEARCH(@json, 'one', 'Wag') |
+----------------------------------+
| "$.name"                         |
+----------------------------------+

Ecco un esempio di restituzione del percorso per un elemento in un array:

SET @json = '
    { 
        "product" : "Left Handed Screwdriver", 
        "sizes" : [ "Small", "Medium", "Large" ],
    }';

SELECT JSON_SEARCH(@json, 'one', 'Medium');

Risultato:

+-------------------------------------+
| JSON_SEARCH(@json, 'one', "Medium") |
+-------------------------------------+
| "$.sizes[1]"                        |
+-------------------------------------+

Gli array sono a base zero, quindi $.sizes[1] fa riferimento al secondo elemento nell'array.

Ricorrenze multiple

Se vuoi restituire tutti i percorsi che contengono la stringa, usa all invece di one per il secondo argomento.

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');

Risultato:

+----------------------------------+
| JSON_SEARCH(@json, 'all', "Dog") |
+----------------------------------+
| ["$[0].type", "$[1].type"]       |
+----------------------------------+

Se cambiamo all a one , ecco cosa succede:

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');

Risultato:

+----------------------------------+
| JSON_SEARCH(@json, 'one', "Dog") |
+----------------------------------+
| "$[0].type"                      |
+----------------------------------+

Viene restituito un solo percorso.

Specifica un percorso

Ecco un esempio che specifica un percorso per il quale cercare all'interno del documento:

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;

Risultato:

+-----------------------------------------------------------------+
| Result                                                          |
+-----------------------------------------------------------------+
| ["$.details.awards.NZ Dog Award", "$.details.awards.Sumo 2021"] |
+-----------------------------------------------------------------+

In questo caso, la stringa dog in realtà si verifica tre volte all'interno del documento, ma solo due volte al di sotto del percorso specificato.

Inoltre, abbiamo usato NULL per l'argomento del carattere di escape, che comporta l'utilizzo del carattere di escape predefinito, ovvero la barra rovesciata (\ ).

Carattere di escape predefinito

Per impostazione predefinita, il carattere di escape è una barra rovesciata (\ ).

Esempio:

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";

Risultato:

+--------------------------------------+------------+
| Not Escaped                          | Escaped    |
+--------------------------------------+------------+
| ["$[0].pwd", "$[1].pwd", "$[2].pwd"] | "$[0].pwd" |
+--------------------------------------+------------+

Il segno di percentuale (% ) è un carattere jolly che corrisponde a un numero qualsiasi di caratteri. Pertanto, se non sfuggiamo, corrisponderà a qualsiasi numero di caratteri, inclusi i caratteri che non sono segni di percentuale.

Ma quando sfuggiamo al segno di percentuale con il carattere di escape, corrisponderà solo quando c'è esattamente un segno di percentuale in quella posizione.

I risultati di cui sopra riflettono questo.

Specifica un carattere di escape personalizzato

È possibile specificare un carattere di escape personalizzato, se necessario. Per fare ciò, forniscilo come quarto argomento.

Esempio:

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";

Risultato:

+--------------------------------------+------------+
| Not Escaped                          | Escaped    |
+--------------------------------------+------------+
| ["$[0].pwd", "$[1].pwd", "$[2].pwd"] | "$[0].pwd" |
+--------------------------------------+------------+

Quindi otteniamo lo stesso risultato dell'esempio precedente. L'unica differenza è che abbiamo specificato un carattere di escape diverso. In questo caso, abbiamo specificato che il punto esclamativo (! ) è il carattere di escape.

Argomenti nulli

Se uno qualsiasi degli argomenti della stringa di ricerca, della stringa di ricerca o del percorso è NULL , il risultato è 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;

Risultato:

+------+------+------+
| a    | b    | c    |
+------+------+------+
| NULL | NULL | NULL |
+------+------+------+

Conteggio parametri errato

Non fornire argomenti genera un errore:

SELECT JSON_SEARCH();

Risultato:

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_SEARCH'

È lo stesso quando fornisci troppo pochi argomenti:

SELECT JSON_SEARCH('{"a":1}', 'all');

Risultato:

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_SEARCH'