MariaDB
 sql >> Base de données >  >> RDS >> MariaDB

MariaDB JSON_CONTAINS_PATH() expliqué

Dans MariaDB, JSON_CONTAINS_PATH() est une fonction intégrée qui indique si un document JSON donné contient des données sur le ou les chemins spécifiés.

Il renvoie 1 si le document contient des données au(x) chemin(s) spécifié(s), 0 si ce n'est pas le cas, et NULL si l'un des arguments est NULL .

Syntaxe

La syntaxe ressemble à ceci :

JSON_CONTAINS_PATH(json_doc, return_arg, path[, path] ...)

json_doc est le document JSON et le path spécifie le chemin pour lequel rechercher des données. Plusieurs chemins peuvent être fournis.

Le return_arg L'argument détermine comment traiter plusieurs chemins. Cela peut être one ou all .

  • one – La fonction renvoie 1 si au moins un chemin existe dans le document JSON.
  • all – La fonction renvoie 1 uniquement si tous les chemins existent dans le document JSON.

Exemple

Voici un exemple pour illustrer.

SET @json_document = '{ "name": "Wag", "weight": 10 }';

SELECT JSON_CONTAINS_PATH(@json_document, 'one', '$.name');

Résultat :

+-----------------------------------------------------+
| JSON_CONTAINS_PATH(@json_document, 'one', '$.name') |
+-----------------------------------------------------+
|                                                   1 |
+-----------------------------------------------------+

Dans ce cas, le chemin existe et le résultat est 1 .

Dans l'exemple suivant, le chemin n'existe pas et le résultat est 0 :

SET @json_document = '{ "name": "Wag", "weight": 10 }';

SELECT JSON_CONTAINS_PATH(@json_document, 'one', '$.type');

Résultat :

+-----------------------------------------------------+
| JSON_CONTAINS_PATH(@json_document, 'one', '$.type') |
+-----------------------------------------------------+
|                                                   0 |
+-----------------------------------------------------+

Chemins multiples

Voici quelques exemples qui recherchent plusieurs chemins dans le document :

SET @json_document = '{ "name": "Wag", "weight": 10 }';

SELECT JSON_CONTAINS_PATH(
        @json_document, 
        'one', 
        '$.type', 
        '$.weight'
        ) AS Result;

Résultat :

+--------+
| Result |
+--------+
|      1 |
+--------+

Dans cet exemple, nous avons recherché deux chemins. Un chemin existe et l'autre non. Mais nous avons un 1 de toute façon (un résultat positif). C'est parce que nous avons utilisé one comme deuxième argument. Le one spécifie que nous obtiendrons un 1 si l'un des chemins existe.

Voici ce qui se passe si nous utilisons all comme deuxième argument :

SET @json_document = '{ "name": "Wag", "weight": 10 }';

SELECT JSON_CONTAINS_PATH(
    @json_document, 
    'all', 
    '$.type', 
    '$.weight'
    ) AS Result;

Résultat :

+--------+
| Result |
+--------+
|      0 |
+--------+

Cette fois, le résultat est 0 , car tous les chemins n'existent pas dans le document JSON.

Si nous changeons le chemin manquant ($.type ) à celui qui existe, on obtient un résultat différent :

SET @json_document = '{ "name": "Wag", "weight": 10 }';

SELECT JSON_CONTAINS_PATH(
    @json_document, 
    'all', 
    '$.name', 
    '$.weight'
    ) AS Result;

Résultat :

+--------+
| Result |
+--------+
|      1 |
+--------+

Tableaux

Voici un exemple qui teste si un index donné existe dans un tableau :

SET @json_document = '
    { 
        "name": "Wag", 
        "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] 
    }
';

SELECT JSON_CONTAINS_PATH(
        @json_document, 
        'one', 
        '$.awards[2]'
        ) AS Result;

Résultat :

+--------+
| Result |
+--------+
|      1 |
+--------+

Et voici ce qui se passe si nous augmentons l'index à un index inexistant :

SET @json_document = '
    { 
        "name": "Wag", 
        "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] 
    }
';

SELECT JSON_CONTAINS_PATH(
        @json_document, 
        'one', 
        '$.awards[3]'
        ) AS Result;

Résultat :

+--------+
| Result |
+--------+
|      0 |
+--------+

Structures imbriquées

Voici un exemple qui recherche un chemin dans un document imbriqué :

SET @json_document = '
    { 
        "name": "Wag", 
        "specs": { 
            "weight": 10, 
            "height": 30 
            } 
    }
';

SELECT JSON_CONTAINS_PATH(
    @json_document, 
    'one', 
    '$.specs.height'
    ) AS Result;

Résultat :

+--------+
| Result |
+--------+
|      1 |
+--------+

Arguments nuls

Si un argument est NULL , le résultat est 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;

Résultat :

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

Nombre de paramètres incorrect

Ne fournir aucun argument génère une erreur :

SELECT JSON_CONTAINS_PATH();

Résultat :

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

La même chose se produit lorsque vous ne transmettez pas assez d'arguments :

SET @json_document = '{ "name": "Wag", "weight": 10 }';

SELECT JSON_CONTAINS_PATH(@json_document);

Résultat :

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