Dans MariaDB, JSON_SET()
est une fonction intégrée qui met à jour ou insère des données dans un document JSON et renvoie le résultat.
JSON_SET()
peut mettre à jour et insérer des données, alors que JSON_INSERT()
ne peut insérer que des données, et JSON_REPLACE()
peut uniquement mettre à jour les données.
Syntaxe
La syntaxe ressemble à ceci :
JSON_SET(json_doc, path, val[, path, val] ...)
Où :
json_doc
est le document JSON.path
est le chemin de l'élément pour lequel insérer des données ou mettre à jour la valeur.val
est la nouvelle valeur.
Exemple
Voici un exemple pour illustrer.
SET @json = '
{
"name" : "Wag",
"type" : "Cat"
}
';
SELECT JSON_SET(@json, '$.type', 'Dog');
Résultat :
+----------------------------------+ | JSON_SET(@json, '$.type', 'Dog') | +----------------------------------+ | {"name": "Wag", "type": "Dog"} | +----------------------------------+
Dans ce cas, j'ai mis à jour la valeur du type
membre Cat
à Dog
.
Éléments de tableau
Pour mettre à jour ou insérer un élément de tableau, spécifiez l'index de l'élément :
SET @json = '
{
"name" : "Wag",
"scores" : [8, 0, 9]
}
';
SELECT JSON_SET(@json, '$.scores[1]', 7);
Résultat :
+--------------------------------------+ | JSON_SET(@json, '$.scores[1]', 7) | +--------------------------------------+ | {"name": "Wag", "scores": [8, 7, 9]} | +--------------------------------------+
Dans ce cas, le deuxième élément du tableau a été mis à jour avec la nouvelle valeur. Les tableaux sont basés sur zéro, et donc $.scores[1]
fait référence au deuxième élément du tableau.
Insérer des données
Les exemples précédents ont mis à jour les données existantes. Voici un exemple d'insertion de nouvelles données :
SET @json = '
{
"name" : "Wag",
"type" : "Dog"
}
';
SELECT JSON_SET(@json, '$.weight', 10);
Résultat :
+----------------------------------------------+ | JSON_SET(@json, '$.weight', 10) | +----------------------------------------------+ | {"name": "Wag", "type": "Dog", "weight": 10} | +----------------------------------------------+
Ici, nous avons inséré une nouvelle paire clé/valeur ("weight": 10
).
Voici un exemple d'ajout d'un nouvel élément à un tableau :
SET @json = '
{
"name" : "Wag",
"scores" : [8, 0, 9]
}
';
SELECT JSON_SET(@json, '$.scores[3]', 7);
Résultat :
+-----------------------------------------+ | JSON_SET(@json, '$.scores[3]', 7) | +-----------------------------------------+ | {"name": "Wag", "scores": [8, 0, 9, 7]} | +-----------------------------------------+
Cet exemple de tableau pourrait également être fait avec JSON_ARRAY_INSERT()
ou JSON_ARRAY_APPEND()
.
Chemins multiples
La syntaxe permet de définir/mettre à jour des valeurs sur plusieurs chemins avec un seul appel à JSON_SET()
.
Exemple :
SET @json = '
{
"name" : "Scratch",
"type" : "Rat"
}
';
SELECT JSON_SET(@json, '$.type', 'Cat', '$.weight', 10);
Résultat :
+--------------------------------------------------+ | JSON_SET(@json, '$.type', 'Cat', '$.weight', 10) | +--------------------------------------------------+ | {"name": "Scratch", "type": "Cat", "weight": 10} | +--------------------------------------------------+
Dans l'exemple suivant, nous insérons une nouvelle valeur dans un tableau et en mettons à jour une autre :
SET @json = '{ "scores" : [ 0, 1, 2 ] }';
SELECT
JSON_SET(
@json,
'$.scores[1]', "a",
'$.scores[3]', "b"
) AS Result;
Résultat :
+------------------------------+ | Result | +------------------------------+ | {"scores": [0, "a", 2, "b"]} | +------------------------------+
Arguments nuls
Si le json_doc
ou l'un des path
arguments est null
, le résultat est NULL
. Mais si la value
l'argument est null
, alors la valeur est remplacée par null
.
SELECT
JSON_SET(null, '$.a', 1) AS a,
JSON_SET('{"a":1}', null, 1) AS b,
JSON_SET('{"a":1}', '$.a', null) AS c;
Résultat :
+------+------+-------------+ | a | b | c | +------+------+-------------+ | NULL | NULL | {"a": null} | +------+------+-------------+
Dans l'exemple suivant, l'un des arguments de chemin manque à chaque appel à JSON_SET()
. Dans les deux cas, le résultat est NULL
:
SET @json = '
{
"name" : "Wag",
"type" : "Cat"
}
';
SELECT
JSON_SET(@json, null, 'Bark', '$.type', 'Dog') AS a,
JSON_SET(@json, '$.name', 'Bark', null, 'Dog') AS b;
Résultat :
+------+------+ | a | b | +------+------+ | NULL | NULL | +------+------+
Nombre de paramètres incorrect
Appel de JSON_SET()
sans argument génère une erreur :
SELECT JSON_SET();
Résultat :
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_SET'
C'est pareil quand pas assez d'arguments sont passés :
SELECT JSON_SET('{"a":1}');
Résultat :
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_SET'