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