MySQL inclut un certain nombre de fonctions pour travailler avec des documents JSON. Parmi ceux-ci figurent le JSON_MERGE_PATCH()
et JSON_MERGE_PRESERVE()
fonctions.
Ces deux fonctions fusionnent deux ou plusieurs documents JSON et renvoient le résultat. Cependant, il existe certains cas où ces fonctions renverront un résultat différent. Vous devez en être conscient avant de les inclure dans l'une de vos requêtes.
Syntaxe
Tout d'abord, voici la syntaxe de chaque fonction :
JSON_MERGE_PATCH(json_doc, json_doc[, json_doc] ...) JSON_MERGE_PRESERVE(json_doc, json_doc[, json_doc] ...)
Où json_doc
sont les documents JSON à fusionner.
Ainsi, les deux fonctions acceptent deux arguments ou plus, chacun représentant les documents JSON à fusionner.
La différence
Les deux fonctions fonctionnent exactement de la même manière, à deux exceptions près :
JSON_MERGE_PATCH()
supprime tout membre du premier objet avec une clé correspondante dans le second objet, à condition que la valeur associée à la clé du second objet ne soit pas JSON null.- Si le deuxième objet a un membre avec une clé correspondant à un membre du premier objet,
JSON_MERGE_PATCH()
remplace la valeur du premier objet par la valeur du deuxième objet, alors queJSON_MERGE_PRESERVE()
ajoute la deuxième valeur à la première valeur.
Donc, fondamentalement, ils diffèrent dans la façon dont ils gèrent les clés en double.
Exemple
Voici un exemple pour démontrer la différence entre ces deux fonctions.
SELECT JSON_MERGE_PATCH('{"Name": "Bartholomew"}', '{"Name": "Bart"}') JSON_MERGE_PATCH, JSON_MERGE_PRESERVE('{"Name": "Bartholomew"}', '{"Name": "Bart"}') JSON_MERGE_PRESERVE;
Résultat :
+------------------+-----------------------------------+ | JSON_MERGE_PATCH | JSON_MERGE_PRESERVE | +------------------+-----------------------------------+ | {"Name": "Bart"} | {"Name": ["Bartholomew", "Bart"]} | +------------------+-----------------------------------+
Nous pouvons voir que JSON_MERGE_PATCH()
a remplacé la valeur du premier objet (Bartholomew
) avec la deuxième valeur d'objets (Bart
).
JSON_MERGE_PRESERVE()
d'autre part, créé un tableau et rempli avec les deux valeurs.
Exemple 2 – Tableaux
Voici un exemple de fusion de deux tableaux du même nom :
SELECT JSON_MERGE_PATCH('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobbies": ["Skateboarding"]}') JSON_MERGE_PATCH, JSON_MERGE_PRESERVE('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobbies": ["Skateboarding"]}') JSON_MERGE_PRESERVE;
Résultat :
+--------------------------------+-------------------------------------------------------+ | JSON_MERGE_PATCH | JSON_MERGE_PRESERVE | +--------------------------------+-------------------------------------------------------+ | {"Hobbies": ["Skateboarding"]} | {"Hobbies": ["Trouble", "Mischief", "Skateboarding"]} | +--------------------------------+-------------------------------------------------------+
Donc dans ce cas, JSON_MERGE_PATCH()
a remplacé tous les éléments du premier tableau par l'élément du second tableau.
JSON_MERGE_PRESERVE()
a simplement combiné les valeurs des deux tableaux en un seul.
Évidemment, si les tableaux ont des noms différents, ils finiront comme des tableaux séparés (mais dans le même document JSON). Ainsi, dans de tels cas, les deux fonctions renverront le même résultat.
SELECT JSON_MERGE_PATCH('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobby": ["Skateboarding"]}') AS Result UNION ALL SELECT JSON_MERGE_PRESERVE('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobby": ["Skateboarding"]}');
Résultat :
+------------------------------------------------------------------+ | Result | +------------------------------------------------------------------+ | {"Hobby": ["Skateboarding"], "Hobbies": ["Trouble", "Mischief"]} | | {"Hobby": ["Skateboarding"], "Hobbies": ["Trouble", "Mischief"]} | +------------------------------------------------------------------+