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] ...)
Où 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 renvoie1si au moins un chemin existe dans le document JSON.all– La fonction renvoie1uniquement 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'