MySQL JSON_MERGE_PATCH() 函数使用指南

MySQL JSON_MERGE_PATCH() 函数对两个或多个 JSON 文档执行替换合并并返回合并的结果。

此函数和 JSON_MERGE_PRESERVE() 用法相同,但是合并逻辑有所不同。

JSON_MERGE_PATCH() 语法

这里是 MySQL JSON_MERGE_PATCH() 的语法:

JSON_MERGE_PATCH(json1, json2, ...)

参数

json1
必需的。一个 JSON 对象文档。
json2
必需的。一个 JSON 对象文档。

返回值

MySQL JSON_MERGE_PATCH() 函数返回一个由参数指定的多个 JSON 文档合并后的 JSON 文档。JSON_MERGE_PATCH() 执行的是替换合并,即在相同键值时,只保留后面的值。合并的规则如下:

  1. 如果第一个参数不是对象,则合并的结果与第二个参数合并空对象的结果相同。

  2. 如果第二个参数不是对象,则合并的结果为第二个参数。

  3. 如果两个参数都是对象,则合并的对象具有以下成员:

    • 只存在于第一个对象中的成员
    • 只存在于第二个对象中且值不是 null 的成员
    • 存在于第二个对象且值不是 null ,并且在第一个对象中有对应的相同键的成员

也就是说,只有两个对象合并的结果才是对象。如果两个参数为不同的 JSON 类型或者都不是 JSON 对象,则合并结果是第二个参数。

如果任意一个参数为 NULLJSON_MERGE_PATCH() 函数将返回 NULL

如果任意一个参数不是有效的 JSON 文档,MySQL 将会给出错误。您可以使用 JSON_VALID() 验证 JSON 文档的有效性。

JSON_MERGE_PATCH() 示例

这里列出了几个常见的 JSON_MERGE_PATCH() 用法示例。

非 JSON 对象类型合并

下面的演示了如何使用 JSON_MERGE_PATCH() 函数合并两个非 JSON 对象类型的 JSON 文档。

SELECT
    JSON_MERGE_PATCH('2', 'true') as `2 + true`,
    JSON_MERGE_PATCH('true', '2') as `true + 2`,
    JSON_MERGE_PATCH('[1, 2]', '2') as `[1, 2] + 2`,
    JSON_MERGE_PATCH('2', '[1, 2]') as `2 + [1, 2]`,
    JSON_MERGE_PATCH('[1, 2]', '[2, 3]') as `[1, 2] + [2, 3]`;
+----------+----------+------------+------------+-----------------+
| 2 + true | true + 2 | [1, 2] + 2 | 2 + [1, 2] | [1, 2] + [2, 3] |
+----------+----------+------------+------------+-----------------+
| true     | 2        | 2          | [1, 2]     | [2, 3]          |
+----------+----------+------------+------------+-----------------+

这里我们看到,两个参数都不是 JSON 对象,JSON_MERGE_PATCH() 函数返回第二个参数。

合并对象

下面的演示了如何使用 JSON_MERGE_PATCH() 函数合并两个或多个 JSON 对象。

SELECT JSON_MERGE_PATCH('{"x": 1, "z": 7}', '{"x": 2, "y": 3}');
+----------------------------------------------------------+
| JSON_MERGE_PATCH('{"x": 1, "z": 7}', '{"x": 2, "y": 3}') |
+----------------------------------------------------------+
| {"x": 2, "y": 3, "z": 7}                                 |
+----------------------------------------------------------+

若第二个参数中存在值为 null 的键,则该键不会出现结果对象中。

SELECT JSON_MERGE_PATCH('{"x": 1, "z": 7}', '{"x": 2, "z": null}');
+-------------------------------------------------------------+
| JSON_MERGE_PATCH('{"x": 1, "z": 7}', '{"x": 2, "z": null}') |
+-------------------------------------------------------------+
| {"x": 2}                                                    |
+-------------------------------------------------------------+