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

Spiegazione di MariaDB JSON_CONTAINS_PATH()

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 restituisce 1 se esiste almeno un percorso all'interno del documento JSON.
  • all – La funzione restituisce 1 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'