MySQL zawiera szereg funkcji do pracy z dokumentami JSON. Wśród nich są JSON_MERGE_PATCH()
i JSON_MERGE_PRESERVE()
funkcje.
Obie te funkcje łączą co najmniej dwa dokumenty JSON i zwracają wynik. Jednak są pewne przypadki, w których te funkcje zwrócą inny wynik. Musisz być tego świadomy, zanim włączysz je do swoich zapytań.
Składnia
Po pierwsze, oto składnia dla każdej funkcji:
JSON_MERGE_PATCH(json_doc, json_doc[, json_doc] ...) JSON_MERGE_PRESERVE(json_doc, json_doc[, json_doc] ...)
Gdzie json_doc
czy dokumenty JSON mają zostać scalone.
Tak więc obie funkcje akceptują dwa lub więcej argumentów, z których każdy reprezentuje dokumenty JSON, które mają zostać scalone.
Różnica
Obie funkcje działają dokładnie tak samo, z dwoma wyjątkami:
JSON_MERGE_PATCH()
usuwa dowolny element członkowski w pierwszym obiekcie z pasującym kluczem w drugim obiekcie, pod warunkiem, że wartość skojarzona z kluczem w drugim obiekcie nie ma wartości JSON null.- Jeśli drugi obiekt ma element z kluczem pasującym do elementu w pierwszym obiekcie,
JSON_MERGE_PATCH()
zastępuje wartość w pierwszym obiekcie wartością w drugim obiekcie, natomiastJSON_MERGE_PRESERVE()
dołącza drugą wartość do pierwszej wartości.
Zasadniczo różnią się więc sposobem obsługi zduplikowanych kluczy.
Przykład
Oto przykład pokazujący różnicę między tymi dwiema funkcjami.
SELECT JSON_MERGE_PATCH('{"Name": "Bartholomew"}', '{"Name": "Bart"}') JSON_MERGE_PATCH, JSON_MERGE_PRESERVE('{"Name": "Bartholomew"}', '{"Name": "Bart"}') JSON_MERGE_PRESERVE;
Wynik:
+------------------+-----------------------------------+ | JSON_MERGE_PATCH | JSON_MERGE_PRESERVE | +------------------+-----------------------------------+ | {"Name": "Bart"} | {"Name": ["Bartholomew", "Bart"]} | +------------------+-----------------------------------+
Widzimy, że JSON_MERGE_PATCH()
zastąpiono wartość pierwszego obiektu (Bartholomew
) z drugą wartością obiektów (Bart
).
JSON_MERGE_PRESERVE()
z drugiej strony utworzył tablicę i wypełnił ją obiema wartościami.
Przykład 2 – Tablice
Oto przykład połączenia dwóch tablic o tej samej nazwie:
SELECT JSON_MERGE_PATCH('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobbies": ["Skateboarding"]}') JSON_MERGE_PATCH, JSON_MERGE_PRESERVE('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobbies": ["Skateboarding"]}') JSON_MERGE_PRESERVE;
Wynik:
+--------------------------------+-------------------------------------------------------+ | JSON_MERGE_PATCH | JSON_MERGE_PRESERVE | +--------------------------------+-------------------------------------------------------+ | {"Hobbies": ["Skateboarding"]} | {"Hobbies": ["Trouble", "Mischief", "Skateboarding"]} | +--------------------------------+-------------------------------------------------------+
W tym przypadku JSON_MERGE_PATCH()
zamienił wszystkie elementy w pierwszej tablicy na element z drugiej tablicy.
JSON_MERGE_PRESERVE()
po prostu połączył wartości obu tablic w jedną.
Oczywiście, jeśli tablice mają różne nazwy, skończą jako oddzielne tablice (ale w tym samym dokumencie JSON). W takich przypadkach obie funkcje zwrócą ten sam wynik.
SELECT JSON_MERGE_PATCH('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobby": ["Skateboarding"]}') AS Result UNION ALL SELECT JSON_MERGE_PRESERVE('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobby": ["Skateboarding"]}');
Wynik:
+------------------------------------------------------------------+ | Result | +------------------------------------------------------------------+ | {"Hobby": ["Skateboarding"], "Hobbies": ["Trouble", "Mischief"]} | | {"Hobby": ["Skateboarding"], "Hobbies": ["Trouble", "Mischief"]} | +------------------------------------------------------------------+