No MySQL, o
JSON_MERGE_PRESERVE()
A função mescla dois ou mais documentos JSON e retorna o resultado. Você fornece os documentos JSON como argumentos.
Esta função foi adicionada no MySQL 8.0.3 como sinônimo de
JSON_MERGE()
, no entanto, o JSON_MERGE()
A função agora está obsoleta e está sujeita a remoção em uma versão futura do MySQL. Sintaxe
A sintaxe fica assim:
JSON_MERGE_PRESERVE(json_doc, json_doc[, json_doc] ...)
Onde
json_doc
são os documentos JSON a serem mesclados. Se algum dos documentos for inválido, um erro será gerado.
Se algum argumento for
NULL
, esta função retorna NULL
. Exemplo 1 – Uso básico
Aqui está um exemplo para demonstrar.
SELECT JSON_MERGE_PRESERVE('{"Nome":"Homer"}', '{"Idade":39}') Resultado;
Resultado:
+------------------------------+| Resultado |+-----------------------------------------+| {"Idade":39, "Nome":"Homer"} |+------------------------------+
Portanto, neste exemplo, mesclamos dois objetos separados em um objeto.
Este é exatamente o mesmo resultado que obteríamos se usássemos oJSON_MERGE_PATCH()
função. No entanto, se tentarmos mesclar chaves duplicadas, essas duas funções produzirão resultados diferentes.
Exemplo 2 – Chaves duplicadas
Como o nome sugere, oJSON_MERGE_PRESERVE()
função preserva membros com chaves duplicadas (é aqui que difere doJSON_MERGE_PATCH()
função).
SELECT JSON_MERGE_PRESERVE('{"Nome":"Bartholomew"}', '{"Nome":"Bart"}') Resultado;
Resultado:
+-----------------------------------+| Resultado |+-----------------------------------+| {"Nome":["Bartolomeu", "Bart"]} |+------------------------------------------------ --+
Portanto, neste caso, um array foi criado e Bart e Bartholomew foram adicionados como elementos separados desse array.
Isso contrasta com oJSON_MERGE_PATCH()
função, que faz o seguinte:
SELECT JSON_MERGE_PATCH('{"Nome":"Bartholomew"}', '{"Nome":"Bart"}') Resultado;
Resultado:
+------------------+| Resultado |+------------------+| {"Nome":"Bart"} |+------------------+Exemplo 3 – Vários membros
Aqui está outro exemplo, mas com um membro extra no objeto:
SELECT JSON_MERGE_PRESERVE('{"Nome":"Bartolomeu", "Idade":10}', '{"Nome":"Bart"}') Resultado;
Resultado:
+---------------------------------------------- +| Resultado |+---------------------------------------------+ | {"Idade":10, "Nome":["Bartolomeu", "Bart"]} |+-------------------------------------- -------------------+
Isso também funciona ao contrário – o resultado é o mesmo se adicionarmos o membro extra ao segundo objeto.
SELECT JSON_MERGE_PRESERVE('{"Nome":"Bartholomew"}', '{"Nome":"Bart", "Idade":10}') Resultado;
Resultado:
+---------------------------------------------- +| Resultado |+---------------------------------------------+ | {"Idade":10, "Nome":["Bartolomeu", "Bart"]} |+-------------------------------------- -------------------+Exemplo 4 – Mais documentos
Você não está limitado a mesclar apenas dois documentos. Você pode mesclar quantos forem necessários. Aqui está um exemplo de mesclagem de três objetos.
SELECT JSON_MERGE_PRESERVE('{"Nome":"Bart"}', '{"Idade":10}', '{"Cor do cabelo":"Amarelo"}') Resultado;
Resultado:
+---------------------------------------------- -------+| Resultado |+---------------------------------------------------------- ------+| {"Idade":10, "Nome":"Bart", "Cor do cabelo":"Amarelo"} |+------------------------ -----------------------------+Exemplo 5 – Matrizes
Aqui está um exemplo de mesclagem de dois arrays com o mesmo nome:
SELECT JSON_MERGE_PRESERVE('{"Hobbies":["Trouble", "Mischief"]}', '{"Hobbies":["Skateboarding"]}') Resultado;
Resultado:
+---------------------------------------------- ---------+| Resultado |+---------------------------------------------------------- --------+| {"Hobbies":["Problemas", "Travessuras", "Skateboarding"]} |+----------------------------- ---------------+
Este é outro exemplo em queJSON_MERGE_PATCH()
retornaria um resultado diferente.
Obviamente, se os arrays tiverem nomes diferentes, eles terminarão como arrays separados (mas dentro do mesmo documento JSON):
SELECT JSON_MERGE_PRESERVE('{"Hobbies":["Problema", "Travessura"]}', '{"Hobby":["Skateboarding"]}') Resultado;
Resultado:
+---------------------------------------------- --------------------+| Resultado |+---------------------------------------------------------- -------------------+| {"Hobby":["Skateboarding"], "Hobbies":["Problemas", "Travessuras"]} |+----------------------- -------------------------------------------+Exemplo 6 – Um documento JSON maior
Aqui está um exemplo que mescla documentos JSON (um pouco) maiores.
SET @data1 ='{ "Suspect":{ "Name":"Bart", "Hobbies":["Skateboarding", "Mischief"] } }', @data2 ='{ "Suspect":{ " Idade":10, "Pais":["Marge", "Homer"], "Hobbies":["Problema"] } }';SELECT JSON_MERGE_PRESERVE(@data1, @data2) Resultado;
Resultado:
+---------------------------------------------- -------------------------------------------------- ------------------------------+| Resultado |+---------------------------------------------------------- -------------------------------------------------- -----------------------------+| {"Suspect":{"Idade":10, "Nome":"Bart", "Hobbies":["Skate", "Travessuras", "Problemas"], "Pais":["Marge", "Homer" ]}} |+--------------------------------------------- -------------------------------------------------- -------------------------------+
Para obter as regras exatas de como essa função executa mesclagens, consulte a documentação do MySQL.