MySQL bevat een aantal functies voor het werken met JSON-documenten. Hiertoe behoren de JSON_MERGE_PATCH()
en JSON_MERGE_PRESERVE()
functies.
Beide functies voegen twee of meer JSON-documenten samen en retourneren het resultaat. Er zijn echter bepaalde gevallen waarin deze functies een ander resultaat opleveren. U moet hiervan op de hoogte zijn voordat u ze in uw vragen opneemt.
Syntaxis
Ten eerste, hier is de syntaxis voor elke functie:
JSON_MERGE_PATCH(json_doc, json_doc[, json_doc] ...) JSON_MERGE_PRESERVE(json_doc, json_doc[, json_doc] ...)
Waar json_doc
zijn de JSON-documenten die moeten worden samengevoegd.
Beide functies accepteren dus twee of meer argumenten, die elk de JSON-documenten vertegenwoordigen die moeten worden samengevoegd.
Het verschil
Beide functies werken precies hetzelfde, met de volgende twee uitzonderingen:
JSON_MERGE_PATCH()
verwijdert elk lid in het eerste object met een overeenkomende sleutel in het tweede object, op voorwaarde dat de waarde die is gekoppeld aan de sleutel in het tweede object niet JSON null is.- Als het tweede object een lid heeft met een sleutel die overeenkomt met een lid in het eerste object,
JSON_MERGE_PATCH()
vervangt de waarde in het eerste object door de waarde in het tweede object, terwijlJSON_MERGE_PRESERVE()
voegt de tweede waarde toe aan de eerste waarde.
Dus eigenlijk verschillen ze in de manier waarop ze dubbele sleutels verwerken.
Voorbeeld
Hier is een voorbeeld om het verschil tussen deze twee functies te demonstreren.
SELECT JSON_MERGE_PATCH('{"Name": "Bartholomew"}', '{"Name": "Bart"}') JSON_MERGE_PATCH, JSON_MERGE_PRESERVE('{"Name": "Bartholomew"}', '{"Name": "Bart"}') JSON_MERGE_PRESERVE;
Resultaat:
+------------------+-----------------------------------+ | JSON_MERGE_PATCH | JSON_MERGE_PRESERVE | +------------------+-----------------------------------+ | {"Name": "Bart"} | {"Name": ["Bartholomew", "Bart"]} | +------------------+-----------------------------------+
We kunnen zien dat JSON_MERGE_PATCH()
de waarde van het eerste object vervangen (Bartholomew
) met de tweede objectwaarde (Bart
).
JSON_MERGE_PRESERVE()
aan de andere kant, creëerde een array en vulde deze met beide waarden.
Voorbeeld 2 – Arrays
Hier is een voorbeeld van het samenvoegen van twee arrays met dezelfde naam:
SELECT JSON_MERGE_PATCH('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobbies": ["Skateboarding"]}') JSON_MERGE_PATCH, JSON_MERGE_PRESERVE('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobbies": ["Skateboarding"]}') JSON_MERGE_PRESERVE;
Resultaat:
+--------------------------------+-------------------------------------------------------+ | JSON_MERGE_PATCH | JSON_MERGE_PRESERVE | +--------------------------------+-------------------------------------------------------+ | {"Hobbies": ["Skateboarding"]} | {"Hobbies": ["Trouble", "Mischief", "Skateboarding"]} | +--------------------------------+-------------------------------------------------------+
Dus in dit geval JSON_MERGE_PATCH()
heeft alle elementen in de eerste array vervangen door het element in de tweede array.
JSON_MERGE_PRESERVE()
heeft eenvoudig de waarden van beide arrays gecombineerd tot één.
Het is duidelijk dat als de arrays verschillende namen hebben, ze als afzonderlijke arrays eindigen (maar binnen hetzelfde JSON-document). Dus in dergelijke gevallen zullen beide functies hetzelfde resultaat opleveren.
SELECT JSON_MERGE_PATCH('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobby": ["Skateboarding"]}') AS Result UNION ALL SELECT JSON_MERGE_PRESERVE('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobby": ["Skateboarding"]}');
Resultaat:
+------------------------------------------------------------------+ | Result | +------------------------------------------------------------------+ | {"Hobby": ["Skateboarding"], "Hobbies": ["Trouble", "Mischief"]} | | {"Hobby": ["Skateboarding"], "Hobbies": ["Trouble", "Mischief"]} | +------------------------------------------------------------------+