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