Dans MariaDB, JSON_INSERT()
est une fonction intégrée qui insère des données dans un document JSON et renvoie le résultat.
Syntaxe
La syntaxe ressemble à ceci :
JSON_INSERT(json_doc, path, val[, path, val] ...)
Où json_doc
est le document JSON, path
est le chemin d'accès où les données doivent être insérées, et val
est la valeur à insérer dans ce chemin.
Exemple
Voici un exemple pour illustrer.
SET @json_document = '
{
"name": "Wag"
}
';
SELECT JSON_INSERT(@json_document, '$.type', "Dog");
Résultat :
+----------------------------------------------+ | JSON_INSERT(@json_document, '$.type', "Dog") | +----------------------------------------------+ | {"name": "Wag", "type": "Dog"} | +----------------------------------------------+
Ici, j'ai inséré "type": "Dog"
dans le document.
Dans ce cas, j'ai utilisé $.type
comme chemin. Par conséquent, type
est la clé et Dog
est la valeur.
Lorsque le chemin existe déjà
Si vous transmettez un chemin qui existe déjà dans le document JSON, le document d'origine est renvoyé tel quel.
Exemple :
SET @json_document = '
{
"name": "Wag"
}
';
SELECT JSON_INSERT(@json_document, '$.name', "Bark");
Résultat :
+-----------------------------------------------+ | JSON_INSERT(@json_document, '$.name', "Bark") | +-----------------------------------------------+ | {"name": "Wag"} | +-----------------------------------------------+
Insérer des tableaux
Voici un exemple d'insertion d'un tableau dans un document JSON :
SET @json_document = '
{
"name" : "Wag"
}
';
SELECT JSON_INSERT(@json_document, '$.scores', '[ 8, 7, 9 ]');
Résultat :
+--------------------------------------------------------+ | JSON_INSERT(@json_document, '$.scores', '[ 8, 7, 9 ]') | +--------------------------------------------------------+ | {"name": "Wag", "scores": "[ 8, 7, 9 ]"} | +--------------------------------------------------------+
Ajout aux tableaux
Voici un exemple d'utilisation de JSON_INSERT()
pour ajouter des données à un tableau :
SET @json_document = '
{
"_id" : 1,
"awards" : [ "Top Dog", "Best Dog" ]
}
';
SELECT JSON_INSERT(@json_document, '$.awards[2]', "Biggest Dog");
Résultat :
+--------------------------------------------------------------+ | JSON_INSERT(@json_document, '$.awards[2]', "Biggest Dog") | +--------------------------------------------------------------+ | {"_id": 1, "awards": ["Top Dog", "Best Dog", "Biggest Dog"]} | +--------------------------------------------------------------+
Cependant, bien que cela ait bien fonctionné pour cet exemple, cela aurait facilement pu échouer. Par exemple, si nous essayons d'insérer la valeur à un autre endroit du tableau, cela ne fonctionne pas :
SET @json_document = '
{
"_id" : 1,
"awards" : [ "Top Dog", "Best Dog" ]
}
';
SELECT JSON_INSERT(@json_document, '$.awards[1]', "Biggest Dog");
Résultat :
+-----------------------------------------------------------+ | JSON_INSERT(@json_document, '$.awards[1]', "Biggest Dog") | +-----------------------------------------------------------+ | {"_id": 1, "awards": ["Top Dog", "Best Dog"]} | +-----------------------------------------------------------+
Pour insérer des valeurs dans un tableau, utilisez le JSON_ARRAY_INSERT()
fonction à la place.
De plus, bien que nous ayons pu ajouter une valeur à un tableau dans l'exemple ci-dessus, vous feriez probablement mieux d'utiliser le JSON_ARRAY_APPEND()
fonction, car il est conçu spécifiquement à cette fin.
Objets imbriqués
Voici un exemple d'insertion d'une valeur dans un objet imbriqué dans un autre objet :
SET @json_document = '
{
"_id" : 1,
"name" : "Wag",
"details" : {
"type" : "Dog",
"weight" : 20,
"awards" : {
"Florida Dog Awards" : "Top Dog",
"New York Marathon" : "Fastest Dog"
}
}
}
';
SELECT JSON_INSERT(
@json_document,
'$.details.awards.Sumo 2020',
'Biggest Dog'
);
Résultat :
{"_id": 1, "name": "Wag", "details": {"type": "Dog", "weight": 20, "awards": {"Florida Dog Awards": "Top Dog", "New York Marathon": "Fastest Dog", "Sumo 2020": "Biggest Dog"}}}
Embellissez le résultat
Nous pouvons utiliser le JSON_DETAILED()
fonction pour rendre le résultat plus lisible :
SET @json_document = '
{
"_id" : 1,
"name" : "Wag",
"details" : {
"type" : "Dog",
"weight" : 20,
"awards" : {
"Florida Dog Awards" : "Top Dog",
"New York Marathon" : "Fastest Dog"
}
}
}
';
SELECT
JSON_DETAILED(
JSON_INSERT(
@json_document,
'$.details.awards.Sumo 2020',
'Biggest Dog'
)
);
Résultat :
{ "_id": 1, "name": "Wag", "details": { "type": "Dog", "weight": 20, "awards": { "Florida Dog Awards": "Top Dog", "New York Marathon": "Fastest Dog", "Sumo 2020": "Biggest Dog" } } }
Arguments nuls
Si l'un des json_document
ou path
les arguments sont NULL
, le résultat est NULL
:
SELECT
JSON_INSERT(null, '$.type', 'Dog'),
JSON_INSERT('{"a":1}', null, 'Dog');
Résultat :
+------------------------------------+-------------------------------------+ | JSON_INSERT(null, '$.type', 'Dog') | JSON_INSERT('{"a":1}', null, 'Dog') | +------------------------------------+-------------------------------------+ | NULL | NULL | +------------------------------------+-------------------------------------+
Cependant, si la value
l'argument est NULL
, la clé est ajoutée au chemin spécifié, avec une valeur de null
:
SELECT JSON_INSERT('{"a":1}', '$.type', null);
Résultat :
+----------------------------------------+ | JSON_INSERT('{"a":1}', '$.type', null) | +----------------------------------------+ | {"a": 1, "type": null} | +----------------------------------------+
Nombre de paramètres incorrect
Ne fournir aucun argument génère une erreur :
SELECT JSON_INSERT();
Résultat :
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_INSERT'
Il en va de même lorsque vous fournissez trop ou trop peu d'arguments :
SELECT JSON_INSERT('{ "a": 1}');
Résultat :
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_INSERT'
Fonctions similaires
Le JSON_REPLACE()
la fonction peut mettre à jour les données existantes.
Le JSON_SET()
La fonction peut mettre à jour les données existantes et insérer de nouvelles données. Donc JSON_SET()
est comme JSON_INSERT()
et JSON_REPLACE()
en une seule fonction.