MySQL JSON_MERGE_PRESERVE() 函数使用指南

MySQL JSON_MERGE_PRESERVE() 函数合并两个或多个 JSON 文档并返回合并的结果。

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

JSON_MERGE_PRESERVE() 语法

这里是 MySQL JSON_MERGE_PRESERVE() 的语法:

JSON_MERGE_PRESERVE(json1, json2, ...)

参数

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

返回值

MySQL JSON_MERGE_PRESERVE() 函数返回一个由参数指定的多个 JSON 文档合并后的 JSON 文档。JSON_MERGE_PRESERVE() 按照如下规则合并多个 JSON 文档:

  • 两个数组合并为一个数组,保留所有数组中的元素。
  • 两个对象合并为一个对象,保留所有的键和值。
  • 一个纯值会被包装成一个数组并作为数组进行合并
  • 对象和数组合并时,会将对象包装到一个数组中并作为数组进行合并。

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

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

JSON_MERGE_PRESERVE() 示例

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

合并数组

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

SELECT JSON_MERGE_PRESERVE('[1, 2]', '[2, 3]', '[3, 4, 5]');
+------------------------------------------------------+
| JSON_MERGE_PRESERVE('[1, 2]', '[2, 3]', '[3, 4, 5]') |
+------------------------------------------------------+
| [1, 2, 2, 3, 3, 4, 5]                                |
+------------------------------------------------------+

从结果我们可以看出所有数组中的所有元素都被保留下来,不管元素是否重复。并且元素的顺序保持和参数的顺序一致。

合并对象

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

SELECT JSON_MERGE_PRESERVE('{"x": 1}', '{"x": 2, "y": 3}');
+-----------------------------------------------------+
| JSON_MERGE_PRESERVE('{"x": 1}', '{"x": 2, "y": 3}') |
+-----------------------------------------------------+
| {"x": [1, 2], "y": 3}                               |
+-----------------------------------------------------+

这里, 因为 "x": 1"x": 2 的键都是 "x",因此他们的值合并到一个数组中,即: [1, 2]

合并纯值

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

SELECT JSON_MERGE_PRESERVE('1', 'true', '"hello"', 'null');
+-----------------------------------------------------+
| JSON_MERGE_PRESERVE('1', 'true', '"hello"', 'null') |
+-----------------------------------------------------+
| [1, true, "hello", null]                            |
+-----------------------------------------------------+

这里,纯值在合并过程中包装成数组处理,因此,他们最终合并到一个数组中。

合并数组和对象

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

SELECT JSON_MERGE_PRESERVE('{"x": 1}', '[1, 2]');
+-------------------------------------------+
| JSON_MERGE_PRESERVE('{"x": 1}', '[1, 2]') |
+-------------------------------------------+
| [{"x": 1}, 1, 2]                          |
+-------------------------------------------+

这里,合并对象和数组时,对象被自动包装成数组,因此,对象和原数组中的元素都被合并到一个新数组中。