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