MySQL bao gồm một số hàm để làm việc với các tài liệu JSON. Trong số này có JSON_MERGE_PATCH()
và JSON_MERGE_PRESERVE()
các chức năng.
Cả hai hàm này hợp nhất hai hoặc nhiều tài liệu JSON và trả về kết quả. Tuy nhiên, có một số trường hợp các hàm này sẽ trả về một kết quả khác. Bạn cần biết điều này trước khi đưa chúng vào bất kỳ truy vấn nào của mình.
Cú pháp
Đầu tiên, đây là cú pháp cho từng hàm:
JSON_MERGE_PATCH(json_doc, json_doc[, json_doc] ...) JSON_MERGE_PRESERVE(json_doc, json_doc[, json_doc] ...)
Ở đâu json_doc
là các tài liệu JSON sẽ được hợp nhất.
Vì vậy, cả hai hàm đều chấp nhận hai hoặc nhiều đối số, mỗi đối số đại diện cho các tài liệu JSON sẽ được hợp nhất.
Sự khác biệt
Cả hai chức năng hoạt động hoàn toàn giống nhau, với hai ngoại lệ sau:
-
JSON_MERGE_PATCH()
xóa bất kỳ thành viên nào trong đối tượng đầu tiên bằng khóa phù hợp trong đối tượng thứ hai, miễn là giá trị được liên kết với khóa trong đối tượng thứ hai không phải là JSON rỗng. - Nếu đối tượng thứ hai có một thành viên có khóa khớp với một thành viên trong đối tượng đầu tiên,
JSON_MERGE_PATCH()
thay thế giá trị trong đối tượng đầu tiên bằng giá trị trong đối tượng thứ hai, trong khiJSON_MERGE_PRESERVE()
nối giá trị thứ hai với giá trị đầu tiên.
Vì vậy, về cơ bản, chúng khác nhau về cách xử lý các khóa trùng lặp.
Ví dụ
Dưới đây là một ví dụ để chứng minh sự khác biệt giữa hai chức năng này.
SELECT JSON_MERGE_PATCH('{"Name": "Bartholomew"}', '{"Name": "Bart"}') JSON_MERGE_PATCH, JSON_MERGE_PRESERVE('{"Name": "Bartholomew"}', '{"Name": "Bart"}') JSON_MERGE_PRESERVE;
Kết quả:
+------------------+-----------------------------------+ | JSON_MERGE_PATCH | JSON_MERGE_PRESERVE | +------------------+-----------------------------------+ | {"Name": "Bart"} | {"Name": ["Bartholomew", "Bart"]} | +------------------+-----------------------------------+
Chúng ta có thể thấy rằng JSON_MERGE_PATCH()
đã thay thế giá trị của đối tượng đầu tiên (Bartholomew
) với giá trị đối tượng thứ hai (Bart
).
JSON_MERGE_PRESERVE()
mặt khác, đã tạo một mảng và điền nó bằng cả hai giá trị.
Ví dụ 2 - Mảng
Dưới đây là một ví dụ về việc hợp nhất hai mảng có cùng tên:
SELECT JSON_MERGE_PATCH('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobbies": ["Skateboarding"]}') JSON_MERGE_PATCH, JSON_MERGE_PRESERVE('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobbies": ["Skateboarding"]}') JSON_MERGE_PRESERVE;
Kết quả:
+--------------------------------+-------------------------------------------------------+ | JSON_MERGE_PATCH | JSON_MERGE_PRESERVE | +--------------------------------+-------------------------------------------------------+ | {"Hobbies": ["Skateboarding"]} | {"Hobbies": ["Trouble", "Mischief", "Skateboarding"]} | +--------------------------------+-------------------------------------------------------+
Vì vậy, trong trường hợp này, JSON_MERGE_PATCH()
đã thay thế tất cả các phần tử trong mảng đầu tiên bằng phần tử trong mảng thứ hai.
JSON_MERGE_PRESERVE()
chỉ đơn giản là kết hợp các giá trị của cả hai mảng thành một.
Rõ ràng, nếu các mảng có tên khác nhau, chúng sẽ kết thúc dưới dạng các mảng riêng biệt (nhưng trong cùng một tài liệu JSON). Vì vậy, trong những trường hợp như vậy, cả hai hàm sẽ trả về cùng một kết quả.
SELECT JSON_MERGE_PATCH('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobby": ["Skateboarding"]}') AS Result UNION ALL SELECT JSON_MERGE_PRESERVE('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobby": ["Skateboarding"]}');
Kết quả:
+------------------------------------------------------------------+ | Result | +------------------------------------------------------------------+ | {"Hobby": ["Skateboarding"], "Hobbies": ["Trouble", "Mischief"]} | | {"Hobby": ["Skateboarding"], "Hobbies": ["Trouble", "Mischief"]} | +------------------------------------------------------------------+