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 esearch_str
è la stringa.return_arg
è la parola chiaveone
oall
. Se usione
, viene restituito solo il primo percorso. Eventuali altre occorrenze vengono ignorate. Quale percorso è considerato "primo" non è definito (secondo la documentazione di MariaDB). Seall
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'