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_docest le document JSON.pathest le chemin de l'élément pour lequel insérer des données ou mettre à jour la valeur.valest 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'