Mysql
 sql >> Base de données >  >> RDS >> Mysql

JSON_MERGE_PATCH() vs JSON_MERGE_PRESERVE() dans MySQL :Quelle est la différence ?

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] ...)

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 que JSON_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"]} |
+------------------------------------------------------------------+