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