sql >> Base de Datos >  >> RDS >> Mysql

JSON_MERGE_PATCH() vs JSON_MERGE_PRESERVE() en MySQL:¿Cuál es la diferencia?

MySQL incluye una serie de funciones para trabajar con documentos JSON. Entre estos se encuentran el JSON_MERGE_PATCH() y JSON_MERGE_PRESERVE() funciones.

Ambas funciones fusionan dos o más documentos JSON y devuelven el resultado. Sin embargo, hay ciertos casos en los que estas funciones devolverán un resultado diferente. Debe tener esto en cuenta antes de incluirlos en cualquiera de sus consultas.

Sintaxis

Primero, aquí está la sintaxis para cada función:

JSON_MERGE_PATCH(json_doc, json_doc[, json_doc] ...)
JSON_MERGE_PRESERVE(json_doc, json_doc[, json_doc] ...)

Donde json_doc son los documentos JSON que se fusionarán.

Entonces, ambas funciones aceptan dos o más argumentos, cada uno de los cuales representa los documentos JSON que se fusionarán.

La diferencia

Ambas funciones funcionan exactamente igual, con las siguientes dos excepciones:

  • JSON_MERGE_PATCH() elimina cualquier miembro en el primer objeto con una clave coincidente en el segundo objeto, siempre que el valor asociado con la clave en el segundo objeto no sea JSON nulo.
  • Si el segundo objeto tiene un miembro con una clave que coincide con un miembro del primer objeto, JSON_MERGE_PATCH() reemplaza el valor en el primer objeto con el valor en el segundo objeto, mientras que JSON_MERGE_PRESERVE() agrega el segundo valor al primer valor.

Básicamente, difieren en la forma en que manejan las claves duplicadas.

Ejemplo

Aquí hay un ejemplo para demostrar la diferencia entre estas dos funciones.

SELECT 
  JSON_MERGE_PATCH('{"Name": "Bartholomew"}', '{"Name": "Bart"}') JSON_MERGE_PATCH,
  JSON_MERGE_PRESERVE('{"Name": "Bartholomew"}', '{"Name": "Bart"}') JSON_MERGE_PRESERVE;

Resultado:

+------------------+-----------------------------------+
| JSON_MERGE_PATCH | JSON_MERGE_PRESERVE               |
+------------------+-----------------------------------+
| {"Name": "Bart"} | {"Name": ["Bartholomew", "Bart"]} |
+------------------+-----------------------------------+

Podemos ver que JSON_MERGE_PATCH() reemplazó el valor del primer objeto (Bartholomew ) con el valor del segundo objeto (Bart ).

JSON_MERGE_PRESERVE() por otro lado, creó una matriz y la rellenó con ambos valores.

Ejemplo 2:matrices

Este es un ejemplo de la combinación de dos matrices con el mismo nombre:

SELECT 
  JSON_MERGE_PATCH('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobbies": ["Skateboarding"]}') JSON_MERGE_PATCH,
  JSON_MERGE_PRESERVE('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobbies": ["Skateboarding"]}') JSON_MERGE_PRESERVE;

Resultado:

+--------------------------------+-------------------------------------------------------+
| JSON_MERGE_PATCH               | JSON_MERGE_PRESERVE                                   |
+--------------------------------+-------------------------------------------------------+
| {"Hobbies": ["Skateboarding"]} | {"Hobbies": ["Trouble", "Mischief", "Skateboarding"]} |
+--------------------------------+-------------------------------------------------------+

Entonces, en este caso, JSON_MERGE_PATCH() ha reemplazado todos los elementos de la primera matriz con el elemento de la segunda matriz.

JSON_MERGE_PRESERVE() simplemente ha combinado los valores de ambas matrices en una sola.

Obviamente, si los arreglos tienen nombres diferentes, terminarán como arreglos separados (pero dentro del mismo documento JSON). Entonces, en tales casos, ambas funciones devolverán el mismo resultado.

SELECT 
  JSON_MERGE_PATCH('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobby": ["Skateboarding"]}') AS Result
UNION ALL
SELECT 
  JSON_MERGE_PRESERVE('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobby": ["Skateboarding"]}');

Resultado:

+------------------------------------------------------------------+
| Result                                                           |
+------------------------------------------------------------------+
| {"Hobby": ["Skateboarding"], "Hobbies": ["Trouble", "Mischief"]} |
| {"Hobby": ["Skateboarding"], "Hobbies": ["Trouble", "Mischief"]} |
+------------------------------------------------------------------+