В MySQL, JSON_MERGE_PRESERVE()
функцията обединява два или повече JSON документа и връща резултата.
Вие предоставяте JSON документите като аргументи.
Тази функция беше добавена в MySQL 8.0.3 като синоним на JSON_MERGE()
, обаче, JSON_MERGE()
функцията вече е остаряла и подлежи на премахване в бъдеща версия на MySQL.
Синтаксис
Синтаксисът е така:
JSON_MERGE_PRESERVE(json_doc, json_doc[, json_doc] ...)
Където json_doc
са JSON документите, които ще бъдат обединени.
Ако някой от документите е невалиден, възниква грешка.
Ако някой аргумент е NULL
, тази функция връща NULL
.
Пример 1 – Основна употреба
Ето пример за демонстрация.
SELECT JSON_MERGE_PRESERVE('{"Име":"Омир"}', '{"Възраст":39}') Резултат;
Резултат:
+------------------------------+| Резултат |+------------------------------+| {"Възраст":39, "Име":"Омир"} |+------------------------------+предварително>Така че в този пример обединихме два отделни обекта в един обект.
Това е точно същия резултат, който бихме получили, ако използвахме
JSON_MERGE_PATCH()
функция. Въпреки това, ако се опитаме да обединим дублирани ключове, тези две функции ще дадат различни резултати.Пример 2 – Дублирани ключове
Както подсказва името,
JSON_MERGE_PRESERVE()
функцията запазва членове с дублиращи се ключове (това е мястото, където се различава отJSON_MERGE_PATCH()
функция).SELECT JSON_MERGE_PRESERVE('{"Име":"Вартоломей"}', '{"Име":"Барт"}') Резултат;Резултат:
+---------------------------------+| Резултат |+----------------------------------+| {"Име":["Вартоломей", "Барт"]} |+-------------------------------- --+Така че в този случай беше създаден масив и както Барт, така и Бартоломей бяха добавени като отделни елементи от този масив.
Това е в контраст с
JSON_MERGE_PATCH()
функция, която прави следното:SELECT JSON_MERGE_PATCH('{"Име":"Вартоломей"}', '{"Име":"Барт"}') Резултат;Резултат:
+-----------------+| Резултат |+------------------+| {"Име":"Барт"} |+-----------------+Пример 3 – Множество членове
Ето още един пример, но с допълнителен член в обекта:
SELECT JSON_MERGE_PRESERVE('{"Име":"Вартоломей", "Възраст":10}', '{"Име":"Барт"}') Резултат;Резултат:
+------------------------------------------------------- +| Резултат |+------------------------------------------------+ | {"Възраст":10, "Име":["Вартоломей", "Барт"]} |+-------------------------- -------------------+Това работи и обратното – резултатът е същият, ако добавим допълнителния член към втория обект.
SELECT JSON_MERGE_PRESERVE('{"Име":"Вартоломей"}', '{"Име":"Барт", "Възраст":10}') Резултат;Резултат:
+------------------------------------------------------- +| Резултат |+------------------------------------------------+ | {"Възраст":10, "Име":["Вартоломей", "Барт"]} |+-------------------------- -------------------+Пример 4 – Още документи
Не сте ограничени до сливане само на два документа. Можете да обедините колкото е необходимо. Ето пример за обединяване на три обекта.
SELECT JSON_MERGE_PRESERVE('{"Име":"Барт"}', '{"Възраст":10}', '{"Цвят на косата":"Жълт"}') Резултат;Резултат:
+------------------------------------------------------- -------+| Резултат |+-------------------------------------------------------- ------+| {"Възраст":10, "Име":"Барт", "Цвят на косата":"Жълт"} |+------------------------ -----------------------------+Пример 5 – Масиви
Ето пример за сливане на два масива с едно и също име:
SELECT JSON_MERGE_PRESERVE('{"Хобита":["Trouble", "Mischief"]}', '{"Хобита":["Skateboarding"]}') Резултат;Резултат:
+------------------------------------------------------- ---------+| Резултат |+-------------------------------------------------------- --------+| {"Хобита":["Проблеми", "Пакости", "Скейтборд"]} |+---------------------------- ----------------------------------+Това е друг пример, където
JSON_MERGE_PATCH()
ще върне различен резултат.Очевидно, ако масивите имат различни имена, те ще се окажат като отделни масиви (но в рамките на един и същ JSON документ):
SELECT JSON_MERGE_PRESERVE('{"Хобита":["Trouble", "Mischief"]}', '{"Хоби":["Skateboarding"]}') Резултат;Резултат:
+------------------------------------------------------- --------------------+| Резултат |+-------------------------------------------------------- -------------------+| {"Хоби":["Скейтборд"], "Хобита":["Проблеми", "Пакости"]} |+----------------------- -------------------------------------------+Пример 6 – По-голям JSON документ
Ето пример, който обединява (малко) по-големи JSON документи.
SET @data1 ='{ "Подозрения":{ "Име":"Барт", "Хобита":["Скейтборд", "Пакости"] } }', @data2 ='{ "Подозрения":{ " Възраст“:10, „Родители“:[„Мардж“, „Хомър“], „Хобита“:[„Проблеми“] } }';ИЗБЕРЕТЕ JSON_MERGE_PRESERVE(@data1, @data2) Резултат;Резултат:
+------------------------------------------------------- -------------------------------------------------- ------------------------------+| Резултат |+-------------------------------------------------------- -------------------------------------------------- ----------------------------+| {"Sospect":{"Age":10, "Name":"Bart", "Hobbites":["Skateboarding", "Mischief", "Trouble"], "Parents":["Marge", "Homer" ]}} |+----------------------------------------------- -------------------------------------------------- -------------------------------+За точните правила за това как тази функция извършва сливания, вижте документацията на MySQL.