Dans MariaDB, JSON_REMOVE()
est une fonction intégrée qui supprime les données d'un document JSON et renvoie le résultat.
Syntaxe
La syntaxe ressemble à ceci :
JSON_REMOVE(json_doc, path[, path] ...)
Exemple
Voici un exemple pour illustrer.
SET @json = '{ "name" : "Wag", "type" : "Dog" }';
SELECT JSON_REMOVE(@json, '$.type');
Résultat :
+------------------------------+| JSON_REMOVE(@json, '$.type') |+------------------------------+| {"name":"Wag"} |+------------------------------+
Dans ce cas, nous avons supprimé le membre de données type
à partir du document. En d'autres termes, le type
key et sa valeur associée ont été supprimées.
Tableaux
JSON_REMOVE()
peut être utilisé pour supprimer tout le tableau ou des éléments spécifiques dans le tableau.
Pour supprimer tout le tableau, utilisez simplement le nom de la clé :
SET @json = '{ "name" : "Wag", "scores" : [8, 7, 9] }';
SELECT JSON_REMOVE(@json, '$.scores');
Résultat :
+---------------------------------------------+| JSON_REMOVE(@json, '$.scores') |+--------------------------------+| {"name":"Wag"} |+---------------------------------------------+
Cela a supprimé tout le tableau du document.
Pour supprimer un élément de tableau, spécifiez l'index de l'élément. Voici un exemple de suppression d'un élément de tableau d'un tableau :
SET @json = '{ "name" : "Wag", "scores" : [8, 7, 9] }';
SELECT JSON_REMOVE(@json, '$.scores[1]');
Résultat :
+-----------------------------------+| JSON_REMOVE(@json, '$.scores[1]') |+----------------------------------------------- -+| {"name":"Wag", "scores":[8, 9]} |+----------------------------- ------+
Dans ce cas, le deuxième élément du tableau a été supprimé. Les tableaux sont basés sur zéro, et donc $.scores[1]
fait référence au deuxième élément du tableau.
Voir ci-dessous pour savoir comment JSON_REMOVE()
traite de la suppression de plusieurs chemins dans le tableau.
Chemins multiples
Lorsque vous fournissez plusieurs chemins, ils sont évalués de gauche à droite. Cela signifie que le résultat de l'évaluation précédente est utilisé comme valeur pour la suivante.
Il est utile d'être particulièrement attentif à cela lors de la suppression d'éléments d'un tableau en fonction de leur index.
Tout d'abord, voici un exemple qui supprime plusieurs chemins d'un document, en fonction de leur clé :
SET @json = '
{
"name" : "Wag",
"type" : "Dog",
"weight" : 10
}
';
SELECT JSON_REMOVE(@json, '$.type', '$.weight');
Résultat :
+-------------------------------------------------------+| JSON_REMOVE(@json, '$.type', '$.weight') |+------------------------------- -----------+| {"name":"Wag"} |+----------------------------------------------------- ---+
Chaque paire clé/valeur a été supprimée comme prévu.
Dans l'exemple suivant, nous ne supprimons pas la paire clé/valeur. Au lieu de cela, nous supprimons plusieurs éléments d'un tableau :
SET @json = '{ "scores" : [ 0, 1, 2, 3, 4, 5 ] }';
SELECT
JSON_REMOVE(@json, '$.scores[2]', '$.scores[4]') AS a,
JSON_REMOVE(@json, '$.scores[4]', '$.scores[2]') AS b;
Résultat :
+--------------------------+---------------------------- -------+| un | b |+-----------------------------------+-------------------- ------+| {"scores":[0, 1, 3, 4]} | {"scores":[0, 1, 3, 5]} |+--------------------------+------ --------------------+
Dans ce cas, nous avons appelé JSON_REMOVE()
à deux reprises. Les deux spécifient le même index de tableau à supprimer (2
et 4
), mais nous échangeons les arguments lors du deuxième appel. Dans le premier exemple, il va 2
puis 4
(dans cet ordre). Dans le deuxième exemple, c'est 4
puis 2
.
Cela produisait un résultat différent pour chaque appel. Comme mentionné, plusieurs chemins sont évalués de gauche à droite, et l'ordre peut donc affecter le résultat.
Voici un autre exemple qui illustre comment le résultat peut être très différent, selon le nombre de chemins spécifiés, lesquels et dans quel ordre :
SET @json = '{ "scores" : [ 0, 1, 2, 3, 4, 5 ] }';
SELECT
JSON_REMOVE(@json, '$.scores[0]', '$.scores[1]', '$.scores[5]') AS a,
JSON_REMOVE(@json, '$.scores[1]', '$.scores[5]', '$.scores[0]') AS b,
JSON_REMOVE(@json, '$.scores[5]', '$.scores[0]', '$.scores[1]') AS c,
JSON_REMOVE(@json, '$.scores[5]', '$.scores[1]', '$.scores[0]') AS d,
JSON_REMOVE(@json, '$.scores[1]', '$.scores[0]', '$.scores[5]') AS e,
JSON_REMOVE(@json, '$.scores[0]', '$.scores[5]', '$.scores[1]') AS f;
Résultat (en utilisant la sortie verticale) :
a :{"scores":[1, 3, 4, 5]}b :{"scores":[2, 3, 4, 5]}c :{"scores":[1, 3, 4 ]}d :{"scores" :[2, 3, 4]}e :{"scores":[2, 3, 4, 5]}f :{"scores":[1, 3, 4, 5] }Arguments nuls
Si un argument est
NULL
, le résultat estNULL
:SELECT JSON_REMOVE(null, '$.a') AS a, JSON_REMOVE('{"a":1}', null) AS b, JSON_REMOVE(null, null) AS c;
Résultat :
+------+------+------+| un | b | c |+------+------+------+| NUL | NUL | NULL |+------+------+------+Nombre de paramètres incorrect
Appel de
JSON_REMOVE()
sans argument génère une erreur :SELECT JSON_REMOVE();
Résultat :
ERREUR 1582 (42000) :Nombre de paramètres incorrect dans l'appel à la fonction native 'JSON_REMOVE'C'est pareil quand pas assez d'arguments sont passés :
SELECT JSON_REMOVE('{"a":1}');
Résultat :
ERREUR 1582 (42000) :Nombre de paramètres incorrect dans l'appel à la fonction native 'JSON_REMOVE'