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])
Où 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'