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