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 renvoie1
si au moins un chemin existe dans le document JSON.all
– La fonction renvoie1
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'