W MySQL JSON_MERGE_PATCH()
Funkcja wykonuje zgodne z RFC 7396 scalanie dwóch lub więcej dokumentów JSON, bez zachowywania elementów posiadających zduplikowane klucze.
Podajesz dokumenty JSON jako argumenty.
Składnia
Składnia wygląda tak:
JSON_MERGE_PATCH(json_doc, json_doc[, json_doc] ...)
Gdzie json_doc
to dokumenty JSON, które mają zostać scalone. Jeśli którykolwiek z dokumentów jest nieprawidłowy, zgłaszany jest błąd.
Przykład 1 – Podstawowe użycie
Oto przykład do zademonstrowania.
SELECT JSON_MERGE_PATCH('{"Name": "Homer"}', '{"Age": 39}') Result;
Wynik:
+------------------------------+ | Result | +------------------------------+ | {"Age": 39, "Name": "Homer"} | +------------------------------+
W tym przykładzie połączyliśmy dwa oddzielne obiekty w jeden.
Przykład 2 – Zduplikowane klawisze
Jak wspomniano, ta funkcja nie zachowuje członków ze zduplikowanymi kluczami. Przykład:
SELECT JSON_MERGE_PATCH('{"Name": "Bartholomew"}', '{"Name": "Bart"}') Result;
Wynik:
+------------------+ | Result | +------------------+ | {"Name": "Bart"} | +------------------+
Więc w tym przypadku Bart wygrał.
Jeśli chcesz zachować członków ze zduplikowanymi kluczami, użyj JSON_MERGE_PRESERVE()
funkcja zamiast. Użycie tej funkcji w tym przykładzie zmieniłoby Name
do tablicy zawierającej zarówno Bartholomew
i Bart
. Tak:
SELECT JSON_MERGE_PRESERVE('{"Name": "Bartholomew"}', '{"Name": "Bart"}') Result;
Wynik:
+-----------------------------------+ | Result | +-----------------------------------+ | {"Name": ["Bartholomew", "Bart"]} | +-----------------------------------+
Przykład 3 – Wielu członków
Oto kolejny przykład, ale z dodatkowym elementem w obiekcie:
SELECT JSON_MERGE_PATCH('{"Name": "Bartholomew", "Age": 10}', '{"Name": "Bart"}') Result;
Wynik:
+-----------------------------+ | Result | +-----------------------------+ | {"Age": 10, "Name": "Bart"} | +-----------------------------+
Tak więc Bart nadal wygrywa i został połączony z innymi członkami pierwszego obiektu.
Oczywiście działa to również w drugą stronę – wynik jest taki sam, jeśli dodamy dodatkowy element do drugiego obiektu.
SELECT JSON_MERGE_PATCH('{"Name": "Bartholomew"}', '{"Name": "Bart", "Age": 10}') Result;
Wynik:
+-----------------------------+ | Result | +-----------------------------+ | {"Age": 10, "Name": "Bart"} | +-----------------------------+
Przykład 4 – Więcej dokumentów
Nie jesteś ograniczony do połączenia tylko dwóch dokumentów. Możesz połączyć tyle, ile potrzebujesz. Oto przykład scalania trzech obiektów.
SELECT JSON_MERGE_PATCH('{"Name": "Bart"}', '{"Age": 10}', '{"Hair Color": "Yellow"}') Result;
Wynik:
+-----------------------------------------------------+ | Result | +-----------------------------------------------------+ | {"Age": 10, "Name": "Bart", "Hair Color": "Yellow"} | +-----------------------------------------------------+
Przykład 5 – Tablice
Połączenie dwóch tablic o tej samej nazwie spowoduje, że zachowana zostanie tylko jedna z nich:
SELECT JSON_MERGE_PATCH('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobbies": ["Skateboarding"]}') Result;
Wynik:
+--------------------------------+ | Result | +--------------------------------+ | {"Hobbies": ["Skateboarding"]} | +--------------------------------+
Ponownie możesz użyć JSON_MERGE_PRESERVE()
jeśli chcesz zachować obie tablice. Tak więc poprzedni przykład można przepisać w następujący sposób:
SELECT JSON_MERGE_PRESERVE('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobbies": ["Skateboarding"]}') Result;
Wynik:
+-------------------------------------------------------+ | Result | +-------------------------------------------------------+ | {"Hobbies": ["Trouble", "Mischief", "Skateboarding"]} | +-------------------------------------------------------+
Przykład 6 – Większy dokument JSON
Oto przykład, który łączy (nieco) większe dokumenty JSON.
SET @data1 = '{ "Suspect": { "Name": "Bart", "Hobbies": ["Skateboarding", "Mischief"] } }', @data2 = '{ "Suspect": { "Age": 10, "Parents": ["Marge", "Homer"] } }'; SELECT JSON_MERGE_PATCH(@data1, @data2) Result;
Wynik:
+-------------------------------------------------------------------------------------------------------------------+ | Result | +-------------------------------------------------------------------------------------------------------------------+ | {"Suspect": {"Age": 10, "Name": "Bart", "Hobbies": ["Skateboarding", "Mischief"], "Parents": ["Marge", "Homer"]}} | +-------------------------------------------------------------------------------------------------------------------+
Dokładne zasady wykonywania połączeń przez tę funkcję można znaleźć w dokumentacji MySQL.