Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

JSON_MERGE_PATCH() vs JSON_MERGE_PRESERVE() no MySQL:Qual é a diferença?


O MySQL inclui várias funções para trabalhar com documentos JSON. Entre eles estão o JSON_MERGE_PATCH() e JSON_MERGE_PRESERVE() funções.

Ambas as funções mesclam dois ou mais documentos JSON e retornam o resultado. No entanto, existem certos casos em que essas funções retornarão um resultado diferente. Você precisa estar ciente disso antes de incluí-los em qualquer uma de suas consultas.


Sintaxe


Primeiro, aqui está a sintaxe para cada função:
JSON_MERGE_PATCH(json_doc, json_doc[, json_doc] ...)
JSON_MERGE_PRESERVE(json_doc, json_doc[, json_doc] ...)

Onde json_doc são os documentos JSON a serem mesclados.

Portanto, ambas as funções aceitam dois ou mais argumentos, cada um representando os documentos JSON a serem mesclados.

A diferença


Ambas as funções funcionam exatamente da mesma forma, com as duas exceções a seguir:
  • JSON_MERGE_PATCH() remove qualquer membro no primeiro objeto com uma chave correspondente no segundo objeto, desde que o valor associado à chave no segundo objeto não seja JSON nulo.
  • Se o segundo objeto tiver um membro com uma chave correspondente a um membro no primeiro objeto, JSON_MERGE_PATCH() substitui o valor no primeiro objeto pelo valor no segundo objeto, enquanto JSON_MERGE_PRESERVE() anexa o segundo valor ao primeiro valor.

Então, basicamente, eles diferem na maneira como lidam com chaves duplicadas.

Exemplo


Aqui está um exemplo para demonstrar a diferença entre essas duas funções.
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() substituiu o valor do primeiro objeto (Bartholomew ) com o segundo valor de objetos (Bart ).

JSON_MERGE_PRESERVE() por outro lado, criou um array e o preencheu com ambos os valores.

Exemplo 2 – Matrizes


Aqui está um exemplo de mesclagem de dois arrays com o mesmo nome:
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"]} |
+--------------------------------+-------------------------------------------------------+

Portanto, neste caso, JSON_MERGE_PATCH() substituiu todos os elementos da primeira matriz pelo elemento da segunda matriz.

JSON_MERGE_PRESERVE() simplesmente combinou os valores de ambas as matrizes em um.

Obviamente, se os arrays tiverem nomes diferentes, eles terminarão como arrays separados (mas dentro do mesmo documento JSON). Portanto, nesses casos, ambas as funções retornarão o mesmo 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"]} |
+------------------------------------------------------------------+