MySQL inkluderar ett antal funktioner för att arbeta med JSON-dokument. Bland dessa finns JSON_MERGE_PATCH()
och JSON_MERGE_PRESERVE()
funktioner.
Båda dessa funktioner slår samman två eller flera JSON-dokument och returnerar resultatet. Det finns dock vissa fall där dessa funktioner ger ett annat resultat. Du måste vara medveten om detta innan du inkluderar dem i någon av dina frågor.
Syntax
Först, här är syntaxen för varje funktion:
JSON_MERGE_PATCH(json_doc, json_doc[, json_doc] ...) JSON_MERGE_PRESERVE(json_doc, json_doc[, json_doc] ...)
Där json_doc
är JSON-dokumenten som ska slås samman.
Så båda funktionerna accepterar två eller flera argument, som var och en representerar de JSON-dokument som ska slås samman.
Skillnaden
Båda funktionerna fungerar exakt likadant, med följande två undantag:
JSON_MERGE_PATCH()
tar bort alla medlemmar i det första objektet med en matchande nyckel i det andra objektet, förutsatt att värdet som är associerat med nyckeln i det andra objektet inte är JSON null.- Om det andra objektet har en medlem med en nyckel som matchar en medlem i det första objektet,
JSON_MERGE_PATCH()
ersätter värdet i det första objektet med värdet i det andra objektet, medanJSON_MERGE_PRESERVE()
lägger till det andra värdet till det första värdet.
Så i grund och botten skiljer de sig åt i hur de hanterar dubbletter av nycklar.
Exempel
Här är ett exempel för att visa skillnaden mellan dessa två 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 att JSON_MERGE_PATCH()
ersatte det första objektets värde (Bartholomew
) med det andra objektvärdet (Bart
).
JSON_MERGE_PRESERVE()
å andra sidan skapade en array och fyllde den med båda värdena.
Exempel 2 – Arrayer
Här är ett exempel på att slå samman två arrayer med samma namn:
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 det här fallet, JSON_MERGE_PATCH()
har ersatt alla element i den första arrayen med elementet i den andra arrayen.
JSON_MERGE_PRESERVE()
har helt enkelt kombinerat värdena för båda arrayerna till en.
Uppenbarligen, om arrayerna har olika namn, kommer de att sluta som separata arrayer (men inom samma JSON-dokument). Så i sådana fall kommer båda funktionerna att returnera samma 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"]} | +------------------------------------------------------------------+