V MySQL je to JSON_MERGE_PRESERVE()
funkce sloučí dva nebo více dokumentů JSON a vrátí výsledek.
Jako argumenty poskytujete dokumenty JSON.
Tato funkce byla přidána do MySQL 8.0.3 jako synonymum pro JSON_MERGE()
, nicméně JSON_MERGE()
Funkce je nyní zastaralá a v budoucí verzi MySQL bude odstraněna.
Syntaxe
Syntaxe vypadá takto:
JSON_MERGE_PRESERVE(json_doc, json_doc[, json_doc] ...)
Kde json_doc
jsou dokumenty JSON, které mají být sloučeny.
Pokud je některý z dokumentů neplatný, zobrazí se chyba.
Pokud je některý argument NULL
, tato funkce vrací NULL
.
Příklad 1 – Základní použití
Zde je příklad k demonstraci.
SELECT JSON_MERGE_PRESERVE('{"Jméno":"Homer"}', '{"Věk":39}') Výsledek;
Výsledek:
+------------------------------+| Výsledek |+------------------------------+| {"Věk":39, "Jméno":"Homer"} |+------------------------------+V tomto příkladu jsme tedy sloučili dva samostatné objekty do jednoho objektu.
To je přesně stejný výsledek, jaký bychom dostali, kdybychom použili
JSON_MERGE_PATCH()
funkce. Pokud se však pokusíme sloučit duplicitní klíče, tyto dvě funkce přinesou odlišné výsledky.Příklad 2 – Duplicitní klíče
Jak název napovídá,
JSON_MERGE_PRESERVE()
funkce zachovává členy s duplicitními klíči (zde se liší odJSON_MERGE_PATCH()
funkce).SELECT JSON_MERGE_PRESERVE('{"Name":"Bartholomew"}', '{"Name":"Bart"}') Výsledek;Výsledek:
+-----------------------------------+| Výsledek |+-----------------------------------+| {"Jméno":["Bartholomew", "Bart"]} |+--------------------------------- --+Takže v tomto případě bylo vytvořeno pole a Bart i Bartoloměj byli přidáni jako samostatné prvky tohoto pole.
To je v kontrastu s
JSON_MERGE_PATCH()
funkce, která dělá následující:SELECT JSON_MERGE_PATCH('{"Name":"Bartholomew"}', '{"Name":"Bart"}') Výsledek;Výsledek:
+-------------------+| Výsledek |+------------------+| {"Jméno":"Bart"} |+------------------+Příklad 3 – Více členů
Zde je další příklad, ale s dalším členem v objektu:
SELECT JSON_MERGE_PRESERVE('{"Jméno":"Bartoloměj", "Věk":10}', '{"Jméno":"Bart"}') Výsledek;Výsledek:
+---------------------------------------------- +| Výsledek |+----------------------------------------------+ | {"Věk":10, "Jméno":["Bartholomew", "Bart"]} |+---------------------------- -------------------+Funguje to i obráceně – výsledek je stejný, pokud přidáme další člen k druhému objektu.
SELECT JSON_MERGE_PRESERVE('{"Jméno":"Bartholomew"}', '{"Jméno":"Bart", "Věk":10}') Výsledek;Výsledek:
+---------------------------------------------- +| Výsledek |+----------------------------------------------+ | {"Věk":10, "Jméno":["Bartholomew", "Bart"]} |+---------------------------- -------------------+Příklad 4 – Další dokumenty
Nejste omezeni na sloučení pouze dvou dokumentů. Můžete sloučit tolik, kolik potřebujete. Zde je příklad sloučení tří objektů.
SELECT JSON_MERGE_PRESERVE('{"Jméno":"Bart"}', '{"Věk":10}', '{"Barva vlasů":"Yellow"}') Výsledek;Výsledek:
+---------------------------------------------- -------+| Výsledek |+----------------------------------------------- ------+| {"Věk":10, "Jméno":"Bart", "Barva vlasů":"Žlutá"} |+------------------------ -----------------------------+Příklad 5 – Pole
Zde je příklad sloučení dvou polí se stejným názvem:
SELECT JSON_MERGE_PRESERVE('{"Hobbies":["Trouble", "Mischief"]}', '{"Hobbies":["Skateboarding"]}') Výsledek;Výsledek:
+---------------------------------------------- ---------+| Výsledek |+----------------------------------------------- --------+| {"Hobby":["Trouble", "Neplechy", "Skateboarding"]} |+----------------------------- --------------------------+Toto je další příklad
JSON_MERGE_PATCH()
vrátí jiný výsledek.Je zřejmé, že pokud mají pole různé názvy, skončí jako samostatná pole (ale ve stejném dokumentu JSON):
SELECT JSON_MERGE_PRESERVE('{"Hobbies":["Trouble", "Neplechy"]}', '{"Hobby":["Skateboarding"]}') Výsledek;Výsledek:
+---------------------------------------------- ---------------------+| Výsledek |+----------------------------------------------- -------------------+| {"Hobby":["Skateboarding"], "Hobbies":["Trouble", "Neplechy"]} |+------------------------ -------------------------------------------+Příklad 6 – Větší dokument JSON
Zde je příklad, který sloučí (trochu) větší dokumenty JSON.
SET @data1 ='{ "Podezřelý":{ "Jméno":"Bart", "Hobby":["Skateboarding", "Nešlechetnost"] } }', @data2 ='{ "Podezřelý":{ " Věk":10, "Rodiče":["Marge", "Homer"], "Hobby":["Trouble"] } }';SELECT JSON_MERGE_PRESERVE(@data1, @data2) Výsledek;Výsledek:
+---------------------------------------------- -------------------------------------------------- ------------------------------+| Výsledek |+----------------------------------------------- -------------------------------------------------- -----------------------------+| {"Podezřelý":{"Věk":10, "Jméno":"Bart", "Hobby":["Skateboarding", "Neplechy", "Trouble"], "Rodiče":["Marge", "Homer" ]}} |+--------------------------------------------- -------------------------------------------------- -------------------------------+Přesná pravidla, jak tato funkce provádí sloučení, naleznete v dokumentaci MySQL.