本节中的函数修改JSON值并返回结果。
JSON_ARRAY_APPEND (
json_doc
,路径
,瓦尔
(,路径
,瓦尔
]…)将值追加到JSON文档中指定数组的末尾并返回结果。返回
零
如果任何参数是零
.属性时,将发生错误json_doc
参数不是有效的JSON文档路径
参数不是有效的路径表达式或包含*
或**
通配符。路径-值对从左到右计算。通过计算一对生成的文档成为计算下一对的新值。
如果路径选择了标量或对象值,则该值将自动包装到数组中,并将新值添加到该数组中。如果路径不识别JSON文档中的任何值,则忽略对。
mysql> SET @j = '["a", ["b", "c"], "d"]';SELECT JSON_ARRAY_APPEND(@j, '$[1]', 1);+----------------------------------+ | JSON_ARRAY_APPEND (@j[1]美元,1 ) | +----------------------------------+ | [" “,“b”,“c”,1],”d "] | +----------------------------------+ mysql >选择JSON_ARRAY_APPEND (@j[0]美元,2);+----------------------------------+ | JSON_ARRAY_APPEND (@j[0]美元,2 ) | +----------------------------------+ | [[" “2],“b”、“c”,“d "] | +----------------------------------+ mysql >选择JSON_ARRAY_APPEND (@j,美元[1][0]”,3);+-------------------------------------+ | JSON_ARRAY_APPEND (@j, ' $[1][0]”,3 ) | +-------------------------------------+ | [" ”,[[“b”,3],“c”),“d "] | +-------------------------------------+ mysql >设置@j = '{“a”:1、“b”:[2、3],“c”:4}';SELECT JSON_ARRAY_APPEND(@j, '$。b ', ' x ');+------------------------------------+ | JSON_ARRAY_APPEND (@j的美元。b”、“x ') | +------------------------------------+ | {" “b”“:1,:2、3、“x”,“c”:4 } | +------------------------------------+ mysql >选择JSON_ARRAY_APPEND (@j, ' $ c ', ' y ');+--------------------------------------+ | JSON_ARRAY_APPEND (@j, ' $ c”、“y ') | +--------------------------------------+ | {" ”:1、“b”:[2、3],”c”:[4,“y "]} | +--------------------------------------+ mysql >设置@j = '{“a”:1}';SELECT JSON_ARRAY_APPEND(@j, '$', 'z'); +---------------------------------+ | JSON_ARRAY_APPEND(@j, '$', 'z') | +---------------------------------+ | [{"a": 1}, "z"] | +---------------------------------+
在MySQL 5.7中,这个函数被命名为
JSON_APPEND ()
.在MySQL 8.0中不再支持该名称。JSON_ARRAY_INSERT (
json_doc
,路径
,瓦尔
(,路径
,瓦尔
]…)更新JSON文档,插入到文档中的数组中并返回修改后的文档。返回
零
如果任何参数是零
.属性时,将发生错误json_doc
参数不是有效的JSON文档路径
参数不是有效的路径表达式或包含*
或**
通配符或不以数组元素标识符结尾。路径-值对从左到右计算。通过计算一对生成的文档成为计算下一对的新值。
路径不识别JSON文档中的任何数组的对将被忽略。如果路径标识了一个数组元素,则在该元素的位置插入相应的值,并将后面的值向右移动。如果路径标识了数组的位置超过数组的末尾,则该值将插入到数组的末尾。
mysql> SET @j = '["a", {"b": [1,2]}, [3,4]]';mysql >选择JSON_ARRAY_INSERT (@j $ [1] ', ' x ');+------------------------------------+ | JSON_ARRAY_INSERT (@j $ [1] ', ' x ') | +------------------------------------+ | [" ”、“x”,{b:[1, 2]},[3、4 ]] | +------------------------------------+ mysql >选择JSON_ARRAY_INSERT (@j $ [100] ', ' x ');+--------------------------------------+ | JSON_ARRAY_INSERT (@j,“[100]美元”,“x ') | +--------------------------------------+ | [" ”,{b:[1, 2]},(3、4),“x "] | +--------------------------------------+ mysql >选择JSON_ARRAY_INSERT (@j”[1]。b [0] ', ' x ');+-----------------------------------------+ | JSON_ARRAY_INSERT (@j, ' $[1]。b[0]”、“x ') | +-----------------------------------------+ | [" ”,{b: [" x ", 1 2]},[3、4 ]] | +-----------------------------------------+ mysql >选择JSON_ARRAY_INSERT (@j,美元[2][1]',' y ');+---------------------------------------+ | JSON_ARRAY_INSERT (@j, ' $[2][1]”,“y ') | +---------------------------------------+ | [" ”,{b:[1, 2]},(3“y”4 ]] | +---------------------------------------+ mysql >选择JSON_ARRAY_INSERT (@j,“[0]美元”,“x”,“美元[2][1]',' y ');+----------------------------------------------------+ | JSON_ARRAY_INSERT (@j[0]美元,“x”,“美元[2][1]”,“y ') | +----------------------------------------------------+ | [" x”、“一个”,{b:[1, 2]},[3、4 ]] | +----------------------------------------------------+
前面的修改会影响数组中下面元素的位置,所以后面的路径相同
JSON_ARRAY_INSERT ()
Call应该考虑到这一点。在最后一个示例中,第二个路径没有插入任何内容,因为在第一个插入之后,该路径不再匹配任何内容。JSON_INSERT (
json_doc
,路径
,瓦尔
(,路径
,瓦尔
]…)将数据插入JSON文档并返回结果。返回
零
如果任何参数是零
.属性时,将发生错误json_doc
参数不是有效的JSON文档路径
参数不是有效的路径表达式或包含*
或**
通配符。路径-值对从左到右计算。通过计算一对生成的文档成为计算下一对的新值。
文档中现有路径的路径值对将被忽略,并且不会覆盖现有文档值。对于文档中不存在的路径,如果路径标识了以下类型的值之一,则路径-值对将值添加到文档中:
现有对象中不存在的成员。成员被添加到对象并与新值关联。
超出现有数组末端的位置。用新值扩展数组。如果现有值不是数组,则将其自动包装为数组,然后使用新值进行扩展。
否则,文档中不存在的路径的路径-值对将被忽略并不起作用。
比较一下
JSON_INSERT ()
,JSON_REPLACE ()
,JSON_SET ()
,见讨论JSON_SET ()
.mysql> SET @j = '{"a": 1, "b": [2,3]}';mysql> SELECT JSON_INSERT(@j, '$. insert)A ', 10, '$.c', '[true, false]');+----------------------------------------------------+ | JSON_INSERT (@j的美元。“10”$ c”、“[真的,假的 ]') | +----------------------------------------------------+ | {" ”:1、“b”:[2、3],”c”:“(真的,假的 ]"} | +----------------------------------------------------+
结果中列出的第三个也是最后一个值是一个带引号的字符串,而不是像第二个那样的数组(在输出中没有带引号);没有将值转换为JSON类型。要将数组作为数组插入,必须显式地执行这样的类型转换,如下所示:
mysql> SELECT JSON_INSERT(@j, '$. insert)a', 10, '$.c', CAST('[true, false]' AS JSON));+------------------------------------------------------------------+ | JSON_INSERT (@j的美元。“10美元. c,演员(为JSON(真、假) )) | +------------------------------------------------------------------+ | {" ”:1、“b”:[2、3],“c”(真的,假的 ]} | +------------------------------------------------------------------+ 1行集(0.00秒)
JSON_MERGE (
json_doc
,json_doc
(,json_doc
]…)合并两个或多个JSON文档。的同义词
JSON_MERGE_PRESERVE ()
;在MySQL 8.0.3中已弃用,并将在未来的版本中移除。mysql >选择JSON_MERGE(“[1,2]”,“[真,假]”);+---------------------------------------+ | JSON_MERGE([1, 2],[真的,假的 ]') | +---------------------------------------+ | [ 1、2,真的,假的 ] | +---------------------------------------+ 1行集,警告(0.00秒)mysql >显示警告\ G *************************** 1。行***************************级别:警告代码:1287消息:'JSON_MERGE'已弃用,将在未来的版本中删除。\请使用JSON_MERGE_PRESERVE/JSON_MERGE_PATCH代替set中的一行(0.00 sec)
有关其他示例,请参见的条目
JSON_MERGE_PRESERVE ()
.JSON_MERGE_PATCH (
json_doc
,json_doc
(,json_doc
]…)执行一个RFC 7396两个或多个JSON文档的兼容合并并返回合并结果,而不保留具有重复键的成员。如果作为参数传递给此函数的文档中至少有一个无效,则引发错误。
请注意以说明和示例说明此函数与
JSON_MERGE_PRESERVE ()
,请参阅JSON_MERGE_PATCH ()执行以下合并操作:如果第一个参数不是一个对象,则合并的结果与一个空对象与第二个参数合并时的结果相同。
如果第二个参数不是一个对象,则merge的结果是第二个参数。
如果两个参数都是对象,则merge的结果是一个具有以下成员的对象:
第一个对象的所有成员,在第二个对象中没有对应的具有相同键值的成员。
第二个对象的所有成员,这些成员在第一个对象中没有对应的键,并且其值不是JSON
零
文字。键在第一个和第二个对象中都存在,并且在第二个对象中的值不是JSON的所有成员
零
文字。这些成员的值是递归地将第一个对象中的值与第二个对象中的值合并的结果。
有关其他信息,请参见
mysql> SELECT JSON_MERGE_PATCH('[1,2]', '[true, false]');+---------------------------------------------+ | JSON_MERGE_PATCH([1, 2],[真的,假的 ]') | +---------------------------------------------+ | [ 真的,假的 ] | +---------------------------------------------+ mysql >选择JSON_MERGE_PATCH('{“名称”:“x”}',' {" id ": 47} ');+-------------------------------------------------+ | JSON_MERGE_PATCH('{“名称”:“x”}’,‘{" id ": 47 }') | +-------------------------------------------------+ | {" id: 47岁的“名称”:“x "} | +-------------------------------------------------+ mysql >选择JSON_MERGE_PATCH(' 1 ', '真的');+-------------------------------+ | JSON_MERGE_PATCH(' 1 ', '真的 ') | +-------------------------------+ | 真正的 | +-------------------------------+ mysql >选择JSON_MERGE_PATCH(“[1,2]”,“{" id ": 47}”);+------------------------------------------+ | JSON_MERGE_PATCH(“[1,2]”、“{" id ": 47 }') | +------------------------------------------+ | {" id: 47 } | +------------------------------------------+ mysql >选择JSON_MERGE_PATCH('{“a”:1、“b”:2 }', > '{ " ”:3,“c”:4});+-----------------------------------------------------------+ | JSON_MERGE_PATCH('{“a”:1、“b”:2}’,‘{“a”:3,“c”:4 }') | +-----------------------------------------------------------+ | {" ”:3,“b”:2,“c”:4 } | +-----------------------------------------------------------+ mysql >选择JSON_MERGE_PATCH('{“a”:1、“b”:2}’,‘{“a”:3,“c”:4 }', > '{ " ”:5,“d”:6});+-------------------------------------------------------------------------------+ | JSON_MERGE_PATCH('{“a”:1、“b”:2}’,‘{“a”:3,“c”:4}’,‘{“d”:“一”:5日6 }') | +-------------------------------------------------------------------------------+ | {" ”:5,“b”:2,“c”:4,“d”:6 } | +-------------------------------------------------------------------------------+
您可以使用此函数通过指定来删除成员
零
作为第二个参数中相同成员的值,如下所示:mysql >选择JSON_MERGE_PATCH('{“a”:1、“b”:2}”,“{零}“b”:”);+--------------------------------------------------+ | JSON_MERGE_PATCH('{“a”:1、“b”:2}’,‘{“b”:零 }') | +--------------------------------------------------+ | {" ”:1 } | +--------------------------------------------------+
这个例子显示了函数以递归的方式操作;也就是说,成员的值不局限于标量,而是本身可以是JSON文档:
mysql >选择JSON_MERGE_PATCH({”“:{" x ": 1}}”,“{”“:{" y ": 2}}”);+----------------------------------------------------+ | JSON_MERGE_PATCH('{“a”:{" x ": 1}}”,“{”“:{“y”:2 }}') | +----------------------------------------------------+ | {" ":{“x”:1、“y”:2 }} | +----------------------------------------------------+
JSON_MERGE_PATCH ()
MySQL 8.0.3及以上版本支持。JSON_MERGE_PATCH()与JSON_MERGE_PRESERVE()比较。的行为
JSON_MERGE_PATCH ()
和的一样吗JSON_MERGE_PRESERVE ()
,但以下两个例外:JSON_MERGE_PATCH ()
删除第一个对象中与第二个对象中的键相匹配的任何成员,前提是与第二个对象中的键相关联的值不是JSON零
.如果第二个对象的成员键与第一个对象的成员相匹配,
JSON_MERGE_PATCH ()
替换第一个对象中的值与第二个对象中的值一致,而JSON_MERGE_PRESERVE ()
附加第二个值到第一个值。
这个例子比较了合并相同的3个JSON对象的结果,每个对象都有一个匹配的键
“一个”
,具有以下两个功能:mysql >设置@x = '{“a”:1、“b”:2}’,> @y = "{“a”:3,“c”:4}’,> @z = "{“d”:“一”:5日6}';mysql >选择JSON_MERGE_PATCH (@x、@y @z)作为补丁,——> JSON_MERGE_PRESERVE (@x, @y @z)保存\ G *************************** 1。行 *************************** 补丁:{“b”,“a”:5:2,“c”:4,“d”:6}保护:{“a”:1、3、5,“b”:2,“c”:4,“d”:6}
JSON_MERGE_PRESERVE (
json_doc
,json_doc
(,json_doc
]…)合并两个或多个JSON文档并返回合并结果。返回
零
如果任何参数是零
.如果任何参数不是有效的JSON文档,就会发生错误。合并按照以下规则进行。有关其他信息,请参见
相邻的数组合并为一个数组。
相邻对象合并为单个对象。
标量值被自动包装为数组并合并为数组。
相邻数组和对象是通过自动将对象包装为数组并合并两个数组来合并的。
mysql> SELECT JSON_MERGE_PRESERVE('[1,2]', '[true, false]');+------------------------------------------------+ | JSON_MERGE_PRESERVE([1, 2],[真的,假的 ]') | +------------------------------------------------+ | [ 1、2,真的,假的 ] | +------------------------------------------------+ mysql >选择JSON_MERGE_PRESERVE('{“名称”:“x”}',' {" id ": 47} ');+----------------------------------------------------+ | JSON_MERGE_PRESERVE('{“名称”:“x”}’,‘{" id ": 47 }') | +----------------------------------------------------+ | {" id: 47岁的“名称”:“x "} | +----------------------------------------------------+ mysql >选择JSON_MERGE_PRESERVE(' 1 ', '真的');+----------------------------------+ | JSON_MERGE_PRESERVE(' 1 ', '真的 ') | +----------------------------------+ | [ 1、真正的 ] | +----------------------------------+ mysql >选择JSON_MERGE_PRESERVE(“[1,2]”,“{" id ": 47}”);+---------------------------------------------+ | JSON_MERGE_PRESERVE(“[1,2]”、“{" id ": 47 }') | +---------------------------------------------+ | [ 1、2、{" id ": 47岁 }] | +---------------------------------------------+ mysql >选择JSON_MERGE_PRESERVE('{“a”:1、“b”:2 }', > '{ " ”:3,“c”:4});+--------------------------------------------------------------+ | JSON_MERGE_PRESERVE('{“a”:1、“b”:2}’,‘{“a”:3,“c”:4 }') | +--------------------------------------------------------------+ | {" “[1,3],”b: 2,“c”:4 } | +--------------------------------------------------------------+ mysql >选择JSON_MERGE_PRESERVE('{“a”:1、“b”:2}’,‘{“a”:3,“c”:4 }', > '{ " ”:5,“d”:6});+----------------------------------------------------------------------------------+ | JSON_MERGE_PRESERVE('{“a”:1、“b”:2}’,‘{“a”:3,“c”:4}’,‘{“d”:“一”:5日6 }') | +----------------------------------------------------------------------------------+ | {" “(1、3、5):,“b”:2,“c”:4,“d”:6 } | +----------------------------------------------------------------------------------+
此函数在MySQL 8.0.3中作为同义词添加
JSON_MERGE ()
.的JSON_MERGE ()
函数现在已弃用,并将在MySQL的未来版本中删除。这个函数与之相似,但与之不同
JSON_MERGE_PATCH ()
在重要方面;看到JSON_REMOVE (
json_doc
,路径
(,路径
]…)从JSON文档中删除数据并返回结果。返回
零
如果任何参数是零
.属性时,将发生错误json_doc
参数不是有效的JSON文档路径
参数不是有效的路径表达式或is$
或包含*
或**
通配符。的
路径
参数从左到右计算。通过计算一条路径生成的文档成为计算下一条路径的新值。如果要删除的元素在文档中不存在,则不是错误;在这种情况下,路径不会影响文档。
mysql> SET @j = '["a", ["b", "c"], "d"]';SELECT JSON_REMOVE(@j, '$[1]');+-------------------------+ | JSON_REMOVE (@j”,[1美元 ]') | +-------------------------+ | [" ”、“d "] | +-------------------------+
JSON_REPLACE (
json_doc
,路径
,瓦尔
(,路径
,瓦尔
]…)替换JSON文档中的现有值并返回结果。返回
零
如果任何参数是零
.属性时,将发生错误json_doc
参数不是有效的JSON文档路径
参数不是有效的路径表达式或包含*
或**
通配符。路径-值对从左到右计算。通过计算一对生成的文档成为计算下一对的新值。
文档中现有路径的路径值对将用新值覆盖现有文档值。文档中不存在的路径的路径-值对将被忽略,并且不起作用。
在MySQL 8.0.4中,优化器可以执行局部的、就地的更新
JSON
列,而不是删除旧文档并将整个新文档写入该列。属性的更新语句可执行此优化JSON_REPLACE ()
函数并满足中概述的条件JSON_INSERT ()
,JSON_REPLACE ()
,JSON_SET ()
,见讨论JSON_SET ()
.mysql> SET @j = '{"a": 1, "b": [2,3]}';mysql> SELECT JSON_REPLACE(@j, '$。A ', 10, '$.c', '[true, false]');+-----------------------------------------------------+ | JSON_REPLACE (@j的美元。“10”$ c”、“[真的,假的 ]') | +-----------------------------------------------------+ | {" ”:10,“b”:[2,3 ]} | +-----------------------------------------------------+
JSON_SET (
json_doc
,路径
,瓦尔
(,路径
,瓦尔
]…)在JSON文档中插入或更新数据并返回结果。返回
零
如果任何参数是零
或路径
,如果给定,则不定位对象。属性时,将发生错误json_doc
参数不是有效的JSON文档路径
参数不是有效的路径表达式或包含*
或**
通配符。路径-值对从左到右计算。通过计算一对生成的文档成为计算下一对的新值。
文档中现有路径的路径值对将用新值覆盖现有文档值。对于文档中不存在的路径,如果路径标识了以下类型的值之一,则路径-值对将值添加到文档中:
现有对象中不存在的成员。成员被添加到对象并与新值关联。
超出现有数组末端的位置。用新值扩展数组。如果现有值不是数组,则将其自动包装为数组,然后使用新值进行扩展。
否则,文档中不存在的路径的路径-值对将被忽略并不起作用。
在MySQL 8.0.4中,优化器可以执行局部的、就地的更新
JSON
列,而不是删除旧文档并将整个新文档写入该列。属性的更新语句可执行此优化JSON_SET ()
函数并满足中概述的条件JSON_SET ()
,JSON_INSERT ()
,JSON_REPLACE ()
函数相关:JSON_SET ()
替换现有值并添加不存在的值。JSON_INSERT ()
插入值而不替换现有值。JSON_REPLACE ()
替换只有现有的价值观。
下面的示例说明了这些差异,使用文档中存在的一个路径(
美元。
)和另一个不存在的(美元. c
):mysql> SET @j = '{"a": 1, "b": [2,3]}';mysql> SELECT JSON_SET(@j, '$. set)A ', 10, '$.c', '[true, false]');+-------------------------------------------------+ | JSON_SET (@j的美元。“10”$ c”、“[真的,假的 ]') | +-------------------------------------------------+ | {" ”:10,“b”:[2、3],”c”:“(真的,假的 ]"} | +-------------------------------------------------+ mysql >选择JSON_INSERT (@j,”美元。A ', 10, '$.c', '[true, false]');+----------------------------------------------------+ | JSON_INSERT (@j的美元。“10”$ c”、“[真的,假的 ]') | +----------------------------------------------------+ | {" ”:1、“b”:[2、3],”c”:“(真的,假的 ]"} | +----------------------------------------------------+ mysql >选择JSON_REPLACE (@j,”美元。A ', 10, '$.c', '[true, false]');+-----------------------------------------------------+ | JSON_REPLACE (@j的美元。“10”$ c”、“[真的,假的 ]') | +-----------------------------------------------------+ | {" ”:10,“b”:[2,3 ]} | +-----------------------------------------------------+
取消JSON值的引号并将结果返回为
utf8mb4
字符串。返回零
如果论证是零
.如果值以双引号开始和结束,但不是有效的JSON字符串文字,则会发生错误。在字符串中,某些序列具有特殊含义,除非
NO_BACKSLASH_ESCAPES
启用SQL模式。这些序列都以反斜杠(\
),称为转义字符.中所示的转义序列x \只是x
.这些序列区分大小写。例如,\ b
被解释为退格,但是\ B
被解释为B
.下面是使用这个函数的两个简单示例:
mysql> SET @j = ' ' abc ' ';SELECT @j, JSON_UNQUOTE(@j);+-------+------------------+ | @ j | JSON_UNQUOTE (@j ) | +-------+------------------+ | " 校正”| | +-------+------------------+ mysql >设置@j = ' [1, 2, 3];SELECT @j, JSON_UNQUOTE(@j);+-----------+------------------+ | @ j | JSON_UNQUOTE (@j ) | +-----------+------------------+ | [ 1、2、3)|(1、2、3 ] | +-----------+------------------+
下面的一组示例说明了如何做到这一点
JSON_UNQUOTE
处理转义NO_BACKSLASH_ESCAPES
Disabled和enabled:mysql> SELECT @@sql_mode;+------------+ | @@ sql_mode | +------------+ | | +------------+ mysql >选择JSON_UNQUOTE(“\ \ t \ \ u0032”);+------------------------------+ | JSON_UNQUOTE(“\ \ \ \ u0032 "') | +------------------------------+ | 2 | +------------------------------+ mysql >设置@@sql_mode =“NO_BACKSLASH_ESCAPES”;mysql> SELECT JSON_UNQUOTE(' ' \\t\\u0032 ');+------------------------------+ | JSON_UNQUOTE(“\ \ \ \ u0032 "') | +------------------------------+ | \ t \ u0032 | +------------------------------+ mysql >选择JSON_UNQUOTE(“\ t \ u0032”);+----------------------------+ | JSON_UNQUOTE(“\ t \ u0032 "') | +----------------------------+ | 2 | +----------------------------+