MySQL включва редица функции за работа с JSON документи. Сред тях са JSON_MERGE_PATCH() и JSON_MERGE_PRESERVE() функции.
И двете от тези функции обединяват два или повече JSON документа и връщат резултата. Въпреки това, има определени случаи, когато тези функции ще върнат различен резултат. Трябва да сте наясно с това, преди да ги включите в някоя от вашите заявки.
Синтаксис
Първо, ето синтаксиса за всяка функция:
JSON_MERGE_PATCH(json_doc, json_doc[, json_doc] ...) JSON_MERGE_PRESERVE(json_doc, json_doc[, json_doc] ...)
Където json_doc са JSON документите, които ще бъдат обединени.
Така че и двете функции приемат два или повече аргумента, всеки от които представлява JSON документите, които трябва да бъдат обединени.
Разликата
И двете функции работят абсолютно еднакво, със следните две изключения:
JSON_MERGE_PATCH()премахва всеки член в първия обект със съвпадащ ключ във втория обект, при условие че стойността, свързана с ключа във втория обект, не е JSON null.- Ако вторият обект има член с ключ, съответстващ на член в първия обект,
JSON_MERGE_PATCH()замества стойността в първия обект със стойността във втория обект, докатоJSON_MERGE_PRESERVE()добавя втората стойност към първата стойност.
Така че по същество те се различават по начина, по който боравят с дублирани ключове.
Пример
Ето пример за демонстриране на разликата между тези две функции.
SELECT
JSON_MERGE_PATCH('{"Name": "Bartholomew"}', '{"Name": "Bart"}') JSON_MERGE_PATCH,
JSON_MERGE_PRESERVE('{"Name": "Bartholomew"}', '{"Name": "Bart"}') JSON_MERGE_PRESERVE;
Резултат:
+------------------+-----------------------------------+
| JSON_MERGE_PATCH | JSON_MERGE_PRESERVE |
+------------------+-----------------------------------+
| {"Name": "Bart"} | {"Name": ["Bartholomew", "Bart"]} |
+------------------+-----------------------------------+
Можем да видим, че JSON_MERGE_PATCH() замени стойността на първия обект (Bartholomew ) със стойността на втория обект (Bart ).
JSON_MERGE_PRESERVE() от друга страна, създаде масив и го попълни с двете стойности.
Пример 2 – Масиви
Ето пример за сливане на два масива с едно и също име:
SELECT
JSON_MERGE_PATCH('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobbies": ["Skateboarding"]}') JSON_MERGE_PATCH,
JSON_MERGE_PRESERVE('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobbies": ["Skateboarding"]}') JSON_MERGE_PRESERVE;
Резултат:
+--------------------------------+-------------------------------------------------------+
| JSON_MERGE_PATCH | JSON_MERGE_PRESERVE |
+--------------------------------+-------------------------------------------------------+
| {"Hobbies": ["Skateboarding"]} | {"Hobbies": ["Trouble", "Mischief", "Skateboarding"]} |
+--------------------------------+-------------------------------------------------------+
Така че в този случай JSON_MERGE_PATCH() е заменил всички елементи в първия масив с елемента във втория масив.
JSON_MERGE_PRESERVE() просто комбинира стойностите на двата масива в един.
Очевидно, ако масивите имат различни имена, те ще се окажат като отделни масиви (но в един и същ JSON документ). Така че в такива случаи и двете функции ще върнат един и същ резултат.
SELECT
JSON_MERGE_PATCH('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobby": ["Skateboarding"]}') AS Result
UNION ALL
SELECT
JSON_MERGE_PRESERVE('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobby": ["Skateboarding"]}');
Резултат:
+------------------------------------------------------------------+
| Result |
+------------------------------------------------------------------+
| {"Hobby": ["Skateboarding"], "Hobbies": ["Trouble", "Mischief"]} |
| {"Hobby": ["Skateboarding"], "Hobbies": ["Trouble", "Mischief"]} |
+------------------------------------------------------------------+