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