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'