MariaDB JSON_MERGE_PATCH() 函数使用指南

在 MariaDB 中,JSON_MERGE_PATCH() 是一个内置函数,它用于合并两个或多个 JSON 文档并返回合并后的结果。

JSON_MERGE_PATCH() 兼容 RFC 7396,用来替代已经弃用的 JSON_MERGE()

MariaDB JSON_MERGE_PATCH() 语法

这里是 MariaDB JSON_MERGE_PATCH() 的语法:

JSON_MERGE_PATCH(json1, json2, ...)

参数

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

如果您提供了错误数量的参数,MariaDB 将报告一个错误: ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_MERGE_PATCH'

返回值

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

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

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

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

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

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

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

MariaDB 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 对象

下面的演示了如何使用 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, "z": 7, "y": 3}                                 |
+----------------------------------------------------------+

若第二个参数中存在值为 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}                                                    |
+-------------------------------------------------------------+

结论

在 MariaDB 中,JSON_MERGE_PATCH() 是一个内置函数,它用于合并两个或多个 JSON 文档并返回合并后的结果。