In MariaDB, JSON_CONTAINS_PATH()
è una funzione incorporata che indica se un determinato documento JSON contiene dati nel percorso o nei percorsi specificati.
Restituisce 1
se il documento contiene dati nel/i percorso/i specificato/i, 0
in caso contrario, e NULL
se uno qualsiasi degli argomenti è NULL
.
Sintassi
La sintassi è questa:
JSON_CONTAINS_PATH(json_doc, return_arg, path[, path] ...)
Dove json_doc
è il documento JSON e il path
specifica il percorso per cui trovare i dati. Possono essere forniti più percorsi.
Il return_arg
argomento determina come gestire più percorsi. Può essere one
o all
.
one
– La funzione restituisce1
se esiste almeno un percorso all'interno del documento JSON.all
– La funzione restituisce1
solo se tutti i percorsi esistono all'interno del documento JSON.
Esempio
Ecco un esempio da dimostrare.
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(@json_document, 'one', '$.name');
Risultato:
+-----------------------------------------------------+ | JSON_CONTAINS_PATH(@json_document, 'one', '$.name') | +-----------------------------------------------------+ | 1 | +-----------------------------------------------------+
In questo caso, il percorso esiste e il risultato è 1
.
Nell'esempio successivo il percorso non esiste e il risultato è 0
:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(@json_document, 'one', '$.type');
Risultato:
+-----------------------------------------------------+ | JSON_CONTAINS_PATH(@json_document, 'one', '$.type') | +-----------------------------------------------------+ | 0 | +-----------------------------------------------------+
Percorsi multipli
Ecco alcuni esempi che cercano percorsi multipli all'interno del documento:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(
@json_document,
'one',
'$.type',
'$.weight'
) AS Result;
Risultato:
+--------+ | Result | +--------+ | 1 | +--------+
In questo esempio abbiamo cercato due percorsi. Un percorso esiste e l'altro no. Ma abbiamo un 1
comunque (risultato positivo). Questo perché abbiamo usato one
come secondo argomento. Il one
specifica che otterremo un 1
se esiste uno dei percorsi.
Ecco cosa succede se utilizziamo all
come secondo argomento:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(
@json_document,
'all',
'$.type',
'$.weight'
) AS Result;
Risultato:
+--------+ | Result | +--------+ | 0 | +--------+
Questa volta il risultato è 0
, perché non tutti i percorsi esistono nel documento JSON.
Se cambiamo il percorso mancante ($.type
) rispetto a uno esistente, otteniamo un risultato diverso:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(
@json_document,
'all',
'$.name',
'$.weight'
) AS Result;
Risultato:
+--------+ | Result | +--------+ | 1 | +--------+
Array
Ecco un esempio che verifica se un determinato indice esiste all'interno di un array:
SET @json_document = '
{
"name": "Wag",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT JSON_CONTAINS_PATH(
@json_document,
'one',
'$.awards[2]'
) AS Result;
Risultato:
+--------+ | Result | +--------+ | 1 | +--------+
Ed ecco cosa succede se aumentiamo l'indice a uno inesistente:
SET @json_document = '
{
"name": "Wag",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT JSON_CONTAINS_PATH(
@json_document,
'one',
'$.awards[3]'
) AS Result;
Risultato:
+--------+ | Result | +--------+ | 0 | +--------+
Strutture nidificate
Ecco un esempio che cerca un percorso all'interno di un documento nidificato:
SET @json_document = '
{
"name": "Wag",
"specs": {
"weight": 10,
"height": 30
}
}
';
SELECT JSON_CONTAINS_PATH(
@json_document,
'one',
'$.specs.height'
) AS Result;
Risultato:
+--------+ | Result | +--------+ | 1 | +--------+
Argomenti nulli
Se un argomento è NULL
, il risultato è NULL
:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT
JSON_CONTAINS_PATH(null, 'one', '$.weight') AS a,
JSON_CONTAINS_PATH(@json_document, null, '$.weight') AS b,
JSON_CONTAINS_PATH(@json_document, 'one', null) AS c;
Risultato:
+------+------+------+ | a | b | c | +------+------+------+ | NULL | NULL | NULL | +------+------+------+
Conteggio parametri errato
Non fornire argomenti genera un errore:
SELECT JSON_CONTAINS_PATH();
Risultato:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_CONTAINS_PATH'
La stessa cosa accade quando non si passano abbastanza argomenti:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(@json_document);
Risultato:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_CONTAINS_PATH'