In MySQL, de JSON_MERGE_PRESERVE() functie voegt twee of meer JSON-documenten samen en retourneert het resultaat.
U levert de JSON-documenten als argumenten.
Deze functie is toegevoegd in MySQL 8.0.3 als synoniem voor JSON_MERGE() , echter, de JSON_MERGE() functie is nu verouderd en kan in een toekomstige release van MySQL worden verwijderd.
Syntaxis
De syntaxis gaat als volgt:
JSON_MERGE_PRESERVE(json_doc, json_doc[, json_doc] ...)
Waar json_doc zijn de JSON-documenten die moeten worden samengevoegd.
Als een van de documenten ongeldig is, wordt er een fout gegenereerd.
Als een argument NULL is , deze functie retourneert NULL .
Voorbeeld 1 – Basisgebruik
Hier is een voorbeeld om te demonstreren.
SELECT JSON_MERGE_PRESERVE('{"Name": "Homer"}', '{"Age": 39}') Result;
Resultaat:
+------------------------------+
| Result |
+------------------------------+
| {"Age": 39, "Name": "Homer"} |
+------------------------------+
Dus in dit voorbeeld hebben we twee afzonderlijke objecten samengevoegd tot één object.
Dit is precies hetzelfde resultaat dat we zouden krijgen als we de JSON_MERGE_PATCH() zouden gebruiken functie. Als we echter dubbele sleutels proberen samen te voegen, zullen deze twee functies verschillende resultaten opleveren.
Voorbeeld 2 – Dubbele sleutels
Zoals de naam al doet vermoeden, is de JSON_MERGE_PRESERVE() functie behoudt leden met dubbele sleutels (dit is waar het verschilt van de JSON_MERGE_PATCH() functie).
SELECT
JSON_MERGE_PRESERVE('{"Name": "Bartholomew"}', '{"Name": "Bart"}') Result;
Resultaat:
+-----------------------------------+
| Result |
+-----------------------------------+
| {"Name": ["Bartholomew", "Bart"]} |
+-----------------------------------+
In dit geval is er dus een array gemaakt en zijn zowel Bart als Bartholomew toegevoegd als afzonderlijke elementen van die array.
Dit in tegenstelling tot de JSON_MERGE_PATCH() functie, die het volgende doet:
SELECT
JSON_MERGE_PATCH('{"Name": "Bartholomew"}', '{"Name": "Bart"}') Result;
Resultaat:
+------------------+
| Result |
+------------------+
| {"Name": "Bart"} |
+------------------+
Voorbeeld 3 – Meerdere leden
Hier is nog een voorbeeld, maar met een extra lid in het object:
SELECT
JSON_MERGE_PRESERVE('{"Name": "Bartholomew", "Age": 10}', '{"Name": "Bart"}') Result;
Resultaat:
+----------------------------------------------+
| Result |
+----------------------------------------------+
| {"Age": 10, "Name": ["Bartholomew", "Bart"]} |
+----------------------------------------------+
Dit werkt ook andersom – het resultaat is hetzelfde als we het extra lid aan het tweede object toevoegen.
SELECT
JSON_MERGE_PRESERVE('{"Name": "Bartholomew"}', '{"Name": "Bart", "Age": 10}') Result;
Resultaat:
+----------------------------------------------+
| Result |
+----------------------------------------------+
| {"Age": 10, "Name": ["Bartholomew", "Bart"]} |
+----------------------------------------------+
Voorbeeld 4 – Meer documenten
U bent niet beperkt tot het samenvoegen van slechts twee documenten. U kunt er zoveel samenvoegen als nodig is. Hier is een voorbeeld van het samenvoegen van drie objecten.
SELECT
JSON_MERGE_PRESERVE('{"Name": "Bart"}', '{"Age": 10}', '{"Hair Color": "Yellow"}') Result;
Resultaat:
+-----------------------------------------------------+
| Result |
+-----------------------------------------------------+
| {"Age": 10, "Name": "Bart", "Hair Color": "Yellow"} |
+-----------------------------------------------------+
Voorbeeld 5 – Arrays
Hier is een voorbeeld van het samenvoegen van twee arrays met dezelfde naam:
SELECT
JSON_MERGE_PRESERVE('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobbies": ["Skateboarding"]}') Result;
Resultaat:
+-------------------------------------------------------+
| Result |
+-------------------------------------------------------+
| {"Hobbies": ["Trouble", "Mischief", "Skateboarding"]} |
+-------------------------------------------------------+
Dit is een ander voorbeeld waarbij JSON_MERGE_PATCH() zou een ander resultaat opleveren.
Het is duidelijk dat als de arrays verschillende namen hebben, ze als afzonderlijke arrays eindigen (maar binnen hetzelfde JSON-document):
SELECT
JSON_MERGE_PRESERVE('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobby": ["Skateboarding"]}') Result;
Resultaat:
+------------------------------------------------------------------+
| Result |
+------------------------------------------------------------------+
| {"Hobby": ["Skateboarding"], "Hobbies": ["Trouble", "Mischief"]} |
+------------------------------------------------------------------+
Voorbeeld 6 – Een groter JSON-document
Hier is een voorbeeld dat (iets) grotere JSON-documenten samenvoegt.
SET @data1 = '{
"Suspect": {
"Name": "Bart",
"Hobbies": ["Skateboarding", "Mischief"]
}
}',
@data2 = '{
"Suspect": {
"Age": 10,
"Parents": ["Marge", "Homer"],
"Hobbies": ["Trouble"]
}
}';
SELECT JSON_MERGE_PRESERVE(@data1, @data2) Result;
Resultaat:
+------------------------------------------------------------------------------------------------------------------------------+
| Result |
+------------------------------------------------------------------------------------------------------------------------------+
| {"Suspect": {"Age": 10, "Name": "Bart", "Hobbies": ["Skateboarding", "Mischief", "Trouble"], "Parents": ["Marge", "Homer"]}} |
+------------------------------------------------------------------------------------------------------------------------------+
Voor de exacte regels voor hoe deze functie merges uitvoert, zie de MySQL-documentatie.