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()
执行的是替换合并,即在相同键值时,只保留后面的值。合并的规则如下:
-
如果第一个参数不是对象,则合并的结果与第二个参数合并空对象的结果相同。
-
如果第二个参数不是对象,则合并的结果为第二个参数。
-
如果两个参数都是对象,则合并的对象具有以下成员:
- 只存在于第一个对象中的成员
- 只存在于第二个对象中且值不是
null
的成员 - 存在于第二个对象且值不是
null
,并且在第一个对象中有对应的相同键的成员
也就是说,只有两个对象合并的结果才是对象。如果两个参数为不同的 JSON 类型或者都不是 JSON 对象,则合并结果是第二个参数。
如果任意一个参数为 NULL
, JSON_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} |
+-------------------------------------------------------------+