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

JSON_MERGE_PRESERVE() – Combinar varios documentos JSON en MySQL

En MySQL, JSON_MERGE_PRESERVE() combina dos o más documentos JSON y devuelve el resultado.

Proporciona los documentos JSON como argumentos.

Esta función se agregó en MySQL 8.0.3 como sinónimo de JSON_MERGE() , sin embargo, el JSON_MERGE() La función ahora está obsoleta y está sujeta a eliminación en una versión futura de MySQL.

Sintaxis

La sintaxis es así:

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

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

Si alguno de los documentos no es válido, se genera un error.

Si algún argumento es NULL , esta función devuelve NULL .

Ejemplo 1:uso básico

Aquí hay un ejemplo para demostrarlo.

SELECT JSON_MERGE_PRESERVE('{"Name": "Homer"}', '{"Age": 39}') Result;

Resultado:

+------------------------------+
| Result                       |
+------------------------------+
| {"Age": 39, "Name": "Homer"} |
+------------------------------+

Entonces, en este ejemplo, fusionamos dos objetos separados en un solo objeto.

Este es exactamente el mismo resultado que obtendríamos si usáramos JSON_MERGE_PATCH() función. Sin embargo, si intentamos fusionar claves duplicadas, estas dos funciones producirán resultados diferentes.

Ejemplo 2:claves duplicadas

Como sugiere el nombre, JSON_MERGE_PRESERVE() La función conserva los miembros con claves duplicadas (aquí es donde difiere del JSON_MERGE_PATCH() función).

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

Resultado:

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

Entonces, en este caso, se creó una matriz y tanto Bart como Bartholomew se agregaron como elementos separados de esa matriz.

Esto contrasta con JSON_MERGE_PATCH() función, que hace lo siguiente:

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

Resultado:

+------------------+
| Result           |
+------------------+
| {"Name": "Bart"} |
+------------------+

Ejemplo 3:varios miembros

Aquí hay otro ejemplo, pero con un miembro extra en el objeto:

SELECT 
  JSON_MERGE_PRESERVE('{"Name": "Bartholomew", "Age": 10}', '{"Name": "Bart"}') Result;

Resultado:

+----------------------------------------------+
| Result                                       |
+----------------------------------------------+
| {"Age": 10, "Name": ["Bartholomew", "Bart"]} |
+----------------------------------------------+

Esto también funciona al revés:el resultado es el mismo si agregamos el miembro extra al segundo objeto.

SELECT 
  JSON_MERGE_PRESERVE('{"Name": "Bartholomew"}', '{"Name": "Bart", "Age": 10}') Result;

Resultado:

+----------------------------------------------+
| Result                                       |
+----------------------------------------------+
| {"Age": 10, "Name": ["Bartholomew", "Bart"]} |
+----------------------------------------------+

Ejemplo 4:más documentos

No está limitado a fusionar solo dos documentos. Puede fusionar tantos como sea necesario. Este es un ejemplo de la combinación de tres objetos.

SELECT 
  JSON_MERGE_PRESERVE('{"Name": "Bart"}', '{"Age": 10}', '{"Hair Color": "Yellow"}') Result;

Resultado:

+-----------------------------------------------------+
| Result                                              |
+-----------------------------------------------------+
| {"Age": 10, "Name": "Bart", "Hair Color": "Yellow"} |
+-----------------------------------------------------+

Ejemplo 5:matrices

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

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

Resultado:

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

Este es otro ejemplo donde JSON_MERGE_PATCH() devolvería un resultado diferente.

Obviamente, si los arreglos tienen nombres diferentes, terminarán como arreglos separados (pero dentro del mismo documento JSON):

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

Resultado:

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

Ejemplo 6:un documento JSON más grande

Aquí hay un ejemplo que fusiona documentos JSON (ligeramente) más grandes.

SET @data1 = '{  
    "Suspect": {    
       "Name": "Bart", 
       "Hobbies": ["Skateboarding", "Mischief"]  
    }
 }',
 @data2 = '{  
    "Suspect": {    
       "Age": 10, 
       "Parents": ["Marge", "Homer"],
       "Hobbies": ["Trouble"]  
    }
 }';
SELECT JSON_MERGE_PRESERVE(@data1, @data2) Result;

Resultado:

+------------------------------------------------------------------------------------------------------------------------------+
| Result                                                                                                                       |
+------------------------------------------------------------------------------------------------------------------------------+
| {"Suspect": {"Age": 10, "Name": "Bart", "Hobbies": ["Skateboarding", "Mischief", "Trouble"], "Parents": ["Marge", "Homer"]}} |
+------------------------------------------------------------------------------------------------------------------------------+

Para conocer las reglas exactas sobre cómo esta función realiza fusiones, consulte la documentación de MySQL.