V MySQL je to JSON_MERGE_PATCH()
Funkce provede sloučení dvou nebo více dokumentů JSON v souladu s RFC 7396 bez zachování členů s duplicitními klíči.
Jako argumenty poskytujete dokumenty JSON.
Syntaxe
Syntaxe vypadá takto:
JSON_MERGE_PATCH(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.
Příklad 1 – Základní použití
Zde je příklad k demonstraci.
SELECT JSON_MERGE_PATCH('{"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.
Příklad 2 – Duplicitní klíče
Jak již bylo zmíněno, tato funkce nezachovává členy s duplicitními klíči. Příklad:
SELECT JSON_MERGE_PATCH('{"Name":"Bartholomew"}', '{"Name":"Bart"}') Výsledek;Výsledek:
+-------------------+| Výsledek |+------------------+| {"Jméno":"Bart"} |+------------------+Takže v tomto případě vyhrál Bart.
Pokud potřebujete zachovat členy s duplicitními klíči, použijte
JSON_MERGE_PRESERVE()
místo toho funkci. Použití této funkce v tomto příkladu by změniloName
do pole obsahujícího jakBartholomew
aBart
. Takhle:SELECT JSON_MERGE_PRESERVE('{"Name":"Bartholomew"}', '{"Name":"Bart"}') Výsledek;Výsledek:
+-----------------------------------+| Výsledek |+-----------------------------------+| {"Jméno":["Bartholomew", "Bart"]} |+--------------------------------- --+Příklad 3 – Více členů
Zde je další příklad, ale s dalším členem v objektu:
SELECT JSON_MERGE_PATCH('{"Jméno":"Bartoloměj", "Věk":10}', '{"Jméno":"Bart"}') Výsledek;Výsledek:
+-----------------------------+| Výsledek |+-----------------------------+| {"Věk":10, "Jméno":"Bart"} |+-----------------------------+Takže Bart stále vyhrává a byl sloučen s ostatními členy prvního objektu.
Samozřejmě to funguje i opačně – výsledek je stejný, pokud přidáme další člen k druhému objektu.
SELECT JSON_MERGE_PATCH('{"Jméno":"Bartholomew"}', '{"Jméno":"Bart", "Věk":10}') Výsledek;Výsledek:
+-----------------------------+| Výsledek |+-----------------------------+| {"Věk":10, "Jméno":"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_PATCH('{"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
Sloučení dvou polí se stejným názvem bude mít za následek zachování pouze jednoho z nich:
SELECT JSON_MERGE_PATCH('{"Hobbies":["Trouble", "Mischief"]}', '{"Hobbies":["Skateboarding"]}') Výsledek;Výsledek:
+--------------------------------+| Výsledek |+--------------------------------+| {"Hobby":["Skateboarding"]} |+--------------------------------+Opět můžete použít
JSON_MERGE_PRESERVE()
pokud potřebujete zachovat obě pole. Takže předchozí příklad lze přepsat na následující:SELECT JSON_MERGE_PRESERVE('{"Hobbies":["Trouble", "Mischief"]}', '{"Hobbies":["Skateboarding"]}') Výsledek;Výsledek:
+---------------------------------------------- ---------+| Výsledek |+----------------------------------------------- --------+| {"Hobby":["Trouble", "Neplechy", "Skateboarding"]} |+----------------------------- --------------------------+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"] } }';SELECT JSON_MERGE_PATCH(@data1, @data2) Výsledek;Výsledek:
+---------------------------------------------- -------------------------------------------------- --------------------+| Výsledek |+----------------------------------------------- -------------------------------------------------- ------------------+| {"Podezřelý":{"Věk":10, "Jméno":"Bart", "Hobby":["Skateboarding", "Neplechy"], "Rodiče":["Marge", "Homer"]}} | +-------------------------------------------------- -------------------------------------------------- ----------------+Přesná pravidla, jak tato funkce provádí sloučení, naleznete v dokumentaci MySQL.