MySQL中的JSON数据类型4合并JSON值
MySQL 8.0.3(及更⾼版本)⽀持两种合并算法,由和。它们在处理重复键的⽅式上有所不同保留重复键的值,⽽丢弃除最后⼀个值之外的所有值。接下来的⼏段将解释这两个函数中的每⼀个都如何处理 JSON ⽂档(即对象和数组)的不同组合的合并。
注意
与以前版本的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值的类型有哪些异: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"}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。