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