MySQL inkluderer en række funktioner til at arbejde med JSON-dokumenter. Blandt disse er JSON_MERGE_PATCH() og JSON_MERGE_PRESERVE() funktioner.
Begge disse funktioner fletter to eller flere JSON-dokumenter og returnerer resultatet. Der er dog visse tilfælde, hvor disse funktioner vil returnere et andet resultat. Du skal være opmærksom på dette, før du inkluderer dem i nogen af dine forespørgsler.
Syntaks
Først her er syntaksen for hver funktion:
JSON_MERGE_PATCH(json_doc, json_doc[, json_doc] ...) JSON_MERGE_PRESERVE(json_doc, json_doc[, json_doc] ...)
Hvor json_doc er JSON-dokumenterne, der skal flettes.
Så begge funktioner accepterer to eller flere argumenter, der hver repræsenterer de JSON-dokumenter, der skal flettes.
Forskellen
Begge funktioner fungerer nøjagtigt det samme, med følgende to undtagelser:
JSON_MERGE_PATCH()fjerner ethvert medlem i det første objekt med en matchende nøgle i det andet objekt, forudsat at værdien forbundet med nøglen i det andet objekt ikke er JSON null.- Hvis det andet objekt har et medlem med en nøgle, der matcher et medlem i det første objekt,
JSON_MERGE_PATCH()erstatter værdien i det første objekt med værdien i det andet objekt, hvorimodJSON_MERGE_PRESERVE()føjer den anden værdi til den første værdi.
Så dybest set adskiller de sig i den måde, de håndterer duplikerede nøgler på.
Eksempel
Her er et eksempel for at demonstrere forskellen mellem disse to funktioner.
SELECT
JSON_MERGE_PATCH('{"Name": "Bartholomew"}', '{"Name": "Bart"}') JSON_MERGE_PATCH,
JSON_MERGE_PRESERVE('{"Name": "Bartholomew"}', '{"Name": "Bart"}') JSON_MERGE_PRESERVE;
Resultat:
+------------------+-----------------------------------+
| JSON_MERGE_PATCH | JSON_MERGE_PRESERVE |
+------------------+-----------------------------------+
| {"Name": "Bart"} | {"Name": ["Bartholomew", "Bart"]} |
+------------------+-----------------------------------+
Vi kan se, at JSON_MERGE_PATCH() erstattede det første objekts værdi (Bartholomew ) med den anden objektværdi (Bart ).
JSON_MERGE_PRESERVE() på den anden side oprettede en matrix og udfyldte den med begge værdier.
Eksempel 2 – Arrays
Her er et eksempel på sammenlægning af to arrays med samme navn:
SELECT
JSON_MERGE_PATCH('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobbies": ["Skateboarding"]}') JSON_MERGE_PATCH,
JSON_MERGE_PRESERVE('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobbies": ["Skateboarding"]}') JSON_MERGE_PRESERVE;
Resultat:
+--------------------------------+-------------------------------------------------------+
| JSON_MERGE_PATCH | JSON_MERGE_PRESERVE |
+--------------------------------+-------------------------------------------------------+
| {"Hobbies": ["Skateboarding"]} | {"Hobbies": ["Trouble", "Mischief", "Skateboarding"]} |
+--------------------------------+-------------------------------------------------------+
Så i dette tilfælde, JSON_MERGE_PATCH() har erstattet alle elementer i det første array med elementet i det andet array.
JSON_MERGE_PRESERVE() har simpelthen kombineret værdierne af begge arrays til én.
Det er klart, at hvis arrays har forskellige navne, ender de som separate arrays (men inden for det samme JSON-dokument). Så i sådanne tilfælde vil begge funktioner returnere det samme resultat.
SELECT
JSON_MERGE_PATCH('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobby": ["Skateboarding"]}') AS Result
UNION ALL
SELECT
JSON_MERGE_PRESERVE('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobby": ["Skateboarding"]}');
Resultat:
+------------------------------------------------------------------+
| Result |
+------------------------------------------------------------------+
| {"Hobby": ["Skateboarding"], "Hobbies": ["Trouble", "Mischief"]} |
| {"Hobby": ["Skateboarding"], "Hobbies": ["Trouble", "Mischief"]} |
+------------------------------------------------------------------+