MySQL中的JSON数据类型 4 合并 JSON 值

        MySQL 8.0.3(及更高版本)支持两种合并算法,由函数JSON_MERGE_PRESERVE()和JSON_MERGE_PATCH()实现。它们在处理重复键的方式上有所不同:JSON_MERGE_PRESERVE()保留重复键的值,而JSON_MERGE_PATCH()丢弃除最后一个值之外的所有值。接下来的几段将解释这两个函数中的每一个都如何处理 JSON 文档(即对象和数组)的不同组合的合并。

注意

JSON_MERGE_PRESERVE()与以前版本的MySQL(在MySQL 8.0.3中重命名)中的函数相同。 在 MySQL 8.0 中仍支持作为别名,但已弃用,并可能在将来的版本中被删除。JSON_MERGE()JSON_MERGE()JSON_MERGE_PRESERVE()

 合并数组。在组合多个数组的上下文中,数组将合并为单个数组。 通过将稍后命名的数组连接到第一个数组的末尾来执行此操作。 将每个参数视为由单个元素组成的数组(因此有0作为其索引),然后应用"最后一个重复键获胜"逻辑来仅选择最后一个参数。您可以比较此查询显示的结果:JSON_MERGE_PRESERVE()JSON_MERGE_PATCH()

mysql> SELECT
    ->   JSON_MERGE_PRESERVE('[1, 2]', '["a", "b", "c"]', '[true, false]') AS Preserve,
    ->   JSON_MERGE_PATCH('[1, 2]', '["a", "b", "c"]', '[true, false]') AS Patch\G
*************************** 1. row ***************************
Preserve: [1, 2, "a", "b", "c", true, false]
   Patch: [true, false]

        合并后,多个对象将生成单个对象。 通过在数组中组合具有相同键的多个对象的所有唯一值来处理该对象;然后,此数组将用作结果中该键的值。 丢弃找到重复键的值,从左到右工作,以便结果仅包含该键的最后一个值。以下查询说明了重复键的结果差异:JSON_MERGE_PRESERVE()JSON_MERGE_PATCH()a

mysql> SELECT
    ->   JSON_MERGE_PRESERVE('{"a": 1, "b": 2}', '{"c": 3, "a": 4}', '{"c": 5, "d": 3}') AS Preserve,
    ->   JSON_MERGE_PATCH('{"a": 3, "b": 2}', '{"c": 3, "a": 4}', '{"c": 5, "d": 3}') AS Patch\G
*************************** 1. row ***************************
Preserve: {"a": [1, 4], "b": 2, "c": [3, 5], "d": 3}
   Patch: {"a": 4, "b": 2, "c": 5, "d": 3}

        在需要数组值的上下文中使用的非数组值会自动打包:该值由字符括起来,以将其转换为数组。在下面的语句中,每个参数都自动打包为一个数组 (, )。然后,它们被合并以生成单个结果数组;与前两种情况一样,合并具有相同键的值,同时丢弃除最后一个键之外的所有重复键的值,如下所示:[][1][2]JSON_MERGE_PRESERVE()JSON_MERGE_PATCH()

mysql> SELECT
	  ->   JSON_MERGE_PRESERVE('1', '2') AS Preserve,
	  ->   JSON_MERGE_PATCH('1', '2') AS Patch\G
*************************** 1. row ***************************
Preserve: [1, 2]
   Patch: 2

        数组和对象值通过自动包装对象作为数组并通过合并值合并数组来合并数组,或者根据合并函数的选择(或,分别)通过"最后一个重复键获胜"来合并数组,如以下示例所示:JSON_MERGE_PRESERVE()JSON_MERGE_PATCH()

mysql> SELECT
	  ->   JSON_MERGE_PRESERVE('[10, 20]', '{"a": "x", "b": "y"}') AS Preserve,
	  ->   JSON_MERGE_PATCH('[10, 20]', '{"a": "x", "b": "y"}') AS Patch\G
*************************** 1. row ***************************
Preserve: [10, 20, {"a": "x", "b": "y"}]
   Patch: {"a": "x", "b": "y"}

你可能感兴趣的:(#,MySQL,json,mysql,数据库)