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

MariaDB JSON_CONTAINS() expliqué

Dans MariaDB, JSON_CONTAINS() est une fonction intégrée qui vous permet de savoir si une valeur spécifiée se trouve dans le document JSON donné ou à un chemin spécifique dans le document.

Il renvoie 1 s'il contient la valeur, 0 si ce n'est pas le cas, et NULL si l'un des arguments est NULL .

Syntaxe

La syntaxe ressemble à ceci :

JSON_CONTAINS(json_doc, val[, path])

json_doc est le document JSON, val est la valeur à trouver, et path une valeur facultative qui spécifie un chemin dans le document.

Exemple

Voici un exemple pour illustrer.

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

SELECT JSON_CONTAINS(@json_document, '{"name": "Wag"}');

Résultat :

+--------------------------------------------------+
| JSON_CONTAINS(@json_document, '{"name": "Wag"}') |
+--------------------------------------------------+
|                                                1 |
+--------------------------------------------------+

Dans ce cas, il y avait une correspondance, et le résultat est 1 .

Dans l'exemple suivant, il n'y a pas de correspondance :

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

SELECT JSON_CONTAINS(@json_document, '{"name": "Woof"}');

Résultat :

+---------------------------------------------------+
| JSON_CONTAINS(@json_document, '{"name": "Woof"}') |
+---------------------------------------------------+
|                                                 0 |
+---------------------------------------------------+

Notez que la valeur est entourée d'accolades.

Voici ce qui se passe lorsque le deuxième argument n'est pas valide :

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

SELECT JSON_CONTAINS(@json_document, 'Wag');

Résultat :

+--------------------------------------+
| JSON_CONTAINS(@json_document, 'Wag') |
+--------------------------------------+
|                                 NULL |
+--------------------------------------+
1 row in set, 1 warning (0.000 sec)

Voyons l'avertissement :

SHOW WARNINGS;

Résultat :

+---------+------+-----------------------------------------------------------------------------------+
| Level   | Code | Message                                                                           |
+---------+------+-----------------------------------------------------------------------------------+
| Warning | 4038 | Syntax error in JSON text in argument 2 to function 'json_contains' at position 1 |
+---------+------+-----------------------------------------------------------------------------------+

Spécifier un chemin

Vous pouvez éventuellement utiliser un troisième argument pour spécifier un chemin.

Exemple :

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

SELECT JSON_CONTAINS(@json_document, 10, '$.weight');

Résultat :

+-----------------------------------------------+
| JSON_CONTAINS(@json_document, 10, '$.weight') |
+-----------------------------------------------+
|                                             1 |
+-----------------------------------------------+

Lors de la spécification d'un chemin, je n'ai pas eu besoin d'utiliser des accolades.

En voici une qui recherche une chaîne :

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

SELECT JSON_CONTAINS(@json_document, '"Wag"', '$.name');

Résultat :

+--------------------------------------------------+
| JSON_CONTAINS(@json_document, '"Wag"', '$.name') |
+--------------------------------------------------+
|                                                1 |
+--------------------------------------------------+

Remarquez que j'ai utilisé des guillemets doubles à l'intérieur des guillemets simples. Si j'omets les guillemets doubles, voici ce qui se passe :

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

SELECT JSON_CONTAINS(@json_document, 'Wag', '$.name');

Résultat :

+------------------------------------------------+
| JSON_CONTAINS(@json_document, 'Wag', '$.name') |
+------------------------------------------------+
|                                           NULL |
+------------------------------------------------+
1 row in set, 1 warning (0.000 sec)

Et vérifions l'avertissement :

SHOW WARNINGS;

Résultat :

+---------+------+-----------------------------------------------------------------------------------+
| Level   | Code | Message                                                                           |
+---------+------+-----------------------------------------------------------------------------------+
| Warning | 4038 | Syntax error in JSON text in argument 2 to function 'json_contains' at position 1 |
+---------+------+-----------------------------------------------------------------------------------+

Structures imbriquées

Voici un exemple qui recherche une valeur dans un document imbriqué :

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

SELECT JSON_CONTAINS(@json_document, 30, '$.specs.height');

Résultat :

+-----------------------------------------------------+
| JSON_CONTAINS(@json_document, 30, '$.specs.height') |
+-----------------------------------------------------+
|                                                   1 |
+-----------------------------------------------------+

Arguments nuls

Si l'un des arguments est NULL , le résultat est NULL :

SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT 
    JSON_CONTAINS(null, 10, '$.weight') AS a,
    JSON_CONTAINS(@json_document, null, '$.weight') AS b,
    JSON_CONTAINS(@json_document, 10, 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();

Résultat :

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

Il en va de même lorsque vous fournissez trop d'arguments :

SELECT JSON_CONTAINS('{ "a": 1}', 1, 2, 3);

Résultat :

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