本节中的函数修改JSON值并返回结果。
JSON_APPEND (
json_doc
那小路
那瓦尔
(,小路
那瓦尔
] ...)在JSON文档中将值追加到指定数组的末尾并返回结果。这个函数被重命名为
json_array_append()
在mysql 5.7.9中;别名json_append()
现在在MySQL 5.7中弃用,并在MySQL 8.0中删除。json_array_append(
json_doc
那小路
那瓦尔
(,小路
那瓦尔
] ...)在JSON文档中将值追加到指定数组的末尾并返回结果。回报
零
如果有任何争论零
。如果存在错误json_doc
参数不是有效的JSON文件或任何小路
参数不是有效的路径表达式或包含*
或者* *
通配符。将路径值对左右进行评估。通过评估一对产生的文档成为评估下一个对的新值。
如果路径选择标量或对象值,则该值在数组中自动映射,并且将新值添加到该数组。路径未识别JSON文档中任何值的对被忽略。
mysql> SET @j = '["a", ["b", "c"], "d"]';mysql>选择json_array_append(@j,'$ [1]',1);+ ------------------------------- + |json_array_append(@j,'$ [1]',1)|+ ------------------------------- + |[“A”,[“B”,“C”,1],“D”] |+ ----------------------------- + MySQL> Select JSON_ARRAY_APPEND(@J,'$ [0]',2);+ ------------------------------- + |json_array_append(@j,'$ [0]'',2)|+ ------------------------------- + | [["a", 2], ["b", "c"], "d"] | +----------------------------------+ mysql> SELECT JSON_ARRAY_APPEND(@j, '$[1][0]', 3); +-------------------------------------+ | JSON_ARRAY_APPEND(@j, '$[1][0]', 3) | +-------------------------------------+ | ["a", [["b", 3], "c"], "d"] | +-------------------------------------+ mysql> SET @j = '{"a": 1, "b": [2, 3], "c": 4}'; mysql> SELECT JSON_ARRAY_APPEND(@j, '$.b', 'x'); +------------------------------------+ | JSON_ARRAY_APPEND(@j, '$.b', 'x') | +------------------------------------+ | {"a": 1, "b": [2, 3, "x"], "c": 4} | +------------------------------------+ mysql> SELECT JSON_ARRAY_APPEND(@j, '$.c', 'y'); +--------------------------------------+ | JSON_ARRAY_APPEND(@j, '$.c', 'y') | +--------------------------------------+ | {"a": 1, "b": [2, 3], "c": [4, "y"]} | +--------------------------------------+ mysql> SET @j = '{"a": 1}'; mysql> SELECT JSON_ARRAY_APPEND(@j, '$', 'z'); +---------------------------------+ | JSON_ARRAY_APPEND(@j, '$', 'z') | +---------------------------------+ | [{"a": 1}, "z"] | +---------------------------------+
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 ()
呼叫应该考虑到这一点。在最后的示例中,第二路径在第一路径中插入任何内容,因为路径在第一插入后不再匹配。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>选择json_insert(@j,'$ .a',10,'$ .c','[true,false]');+----------------------------------------------------+ | JSON_INSERT (@j的美元。a', 10, '$.c', '[true, false]') | +----------------------------------------------------+ | {"a": 1, "b": [2, 3], "c": "[true, false]"} | +----------------------------------------------------+
结果中列出的第三个也是最后一个值是一个带引号的字符串,而不是第二个(在输出中没有带引号)的数组;没有将值转换为JSON类型。要将数组作为数组插入,必须显式执行此类强制转换,如下所示:
mysql> SELECT JSON_INSERT(@j, '$ ');a', 10, '$.c', CAST('[true, false]' 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_preve()
;在MySQL 5.7.22中已弃用,可能会在未来的版本中移除。mysql >选择JSON_MERGE(“[1,2]”,“[真,假]”);+---------------------------------------+ | JSON_MERGE([1, 2],[真的,假的 ]') | +---------------------------------------+ | [ 1、2,真的,假的 ] | +---------------------------------------+ 1行集,警告(0.00秒)mysql >显示警告\ G *************************** 1。消息:'JSON_MERGE'已弃用,将在未来的版本中删除。\请使用JSON_MERGE_PRESERVE/JSON_MERGE_PATCH代替set (0.00 sec)中的一行
有关其他示例,请参见
json_merge_preve()
。JSON_MERGE_PATCH (
json_doc
那json_doc
(,json_doc
] ...)执行A.RFC 7396符合两个或多个JSON文档的合并并返回合并结果,而无需保留具有重复密钥的成员。如果作为此函数的参数传递的文档中的至少一个文档无效,则会引发错误。
笔记有关此功能与差异的说明和示例
json_merge_preve()
, 看JSON_MERGE_PATCH ()执行合并,如下所示:如果第一个参数不是对象,则合并的结果与空对象与第二个参数合并的结果相同。
如果第二个参数不是一个对象,则合并的结果是第二个参数。
如果两个参数都是对象,则合并的结果是一个具有以下成员的对象:
第一对象的所有成员在第二对象中没有具有相同键的相应成员。
在第一个对象中没有相应键的第二个对象的所有成员,其值不是JSON
零
文字。具有键的所有成员,该键同时存在于第一个和第二个对象中,且其值在第二个对象中不是JSON
零
文字。这些成员的值是使用第二对象中的值递归地将第一个对象中的值递归合并的结果。
有关其他信息,请参阅
mysql>选择json_merge_patch('[1,2]','[true,false]');+ ---------------------------------------- + |json_merge_patch('[1,2]','[true,false]')|+ ---------------------------------------- + |[真,假] |+ --------------------------------------- + MySQL>选择json_merge_patch('{“名称”:“x”}','{“ID”:47}');+ ------------------------------------------+ |json_merge_patch('{“姓名”:“x”}','{id“:47}')|+ ------------------------------------------+ | {"id": 47, "name": "x"} | +-------------------------------------------------+ mysql> SELECT JSON_MERGE_PATCH('1', 'true'); +-------------------------------+ | JSON_MERGE_PATCH('1', 'true') | +-------------------------------+ | true | +-------------------------------+ mysql> SELECT JSON_MERGE_PATCH('[1, 2]', '{"id": 47}'); +------------------------------------------+ | JSON_MERGE_PATCH('[1, 2]', '{"id": 47}') | +------------------------------------------+ | {"id": 47} | +------------------------------------------+ mysql> SELECT JSON_MERGE_PATCH('{ "a": 1, "b":2 }', > '{ "a": 3, "c":4 }'); +-----------------------------------------------------------+ | JSON_MERGE_PATCH('{ "a": 1, "b":2 }','{ "a": 3, "c":4 }') | +-----------------------------------------------------------+ | {"a": 3, "b": 2, "c": 4} | +-----------------------------------------------------------+ mysql> SELECT JSON_MERGE_PATCH('{ "a": 1, "b":2 }','{ "a": 3, "c":4 }', > '{ "a": 5, "d":6 }'); +-------------------------------------------------------------------------------+ | JSON_MERGE_PATCH('{ "a": 1, "b":2 }','{ "a": 3, "c":4 }','{ "a": 5, "d":6 }') | +-------------------------------------------------------------------------------+ | {"a": 5, "b": 2, "c": 4, "d": 6} | +-------------------------------------------------------------------------------+
可以使用此函数通过指定来删除成员
零
作为第二个参数中相同成员的值,如下所示:mysql>选择json_merge_patch('{“a”:1,“b”:2}','{“b”:null}');+ ------------------------------------------- + |json_merge_patch('{“a”:1,“b”:2}','{b“:null}')|+ ------------------------------------------- + |{“a”: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 5.7.22及以上版本支持。与json_merge_preve()相比,json_merge_patch()。的行为
JSON_MERGE_PATCH ()
和的是一样的吗json_merge_preve()
,以下两个例外:JSON_MERGE_PATCH ()
移除第一个对象中任何在第二个对象中具有匹配键的成员,前提是与第二个对象中的键关联的值不是JSON零
。如果第二个对象的成员的键与第一个对象中的成员相匹配,
JSON_MERGE_PATCH ()
替换第一个对象中的值和第二个对象中的值,而json_merge_preve()
阑尾第二值为第一个值。
这个例子比较了合并相同的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_preve(
json_doc
那json_doc
(,json_doc
] ...)合并两个或多个JSON文档并返回合并的结果。回报
零
如果有任何争论零
。如果任何参数不是有效的JSON文档,则会发生错误。合并按下列规则进行。有关其他信息,请参阅
相邻数组合并为单个数组。
相邻的对象合并为单个对象。
标量值为AutoRApped作为数组并将其作为数组合并。
通过作为阵列自动映射对象并合并两个数组来合并相邻的阵列和对象。
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 5.7.22中添加为同义词
json_merge()
。这json_merge()
函数现在已被弃用,并将在MySQL的未来版本中移除。此功能类似但与之不同
JSON_MERGE_PATCH ()
在重要的方面;看到JSON_REMOVE (
json_doc
那小路
(,小路
] ...)从JSON文档中删除数据并返回结果。回报
零
如果有任何争论零
。如果存在错误json_doc
参数不是有效的JSON文件或任何小路
参数不是有效的路径表达式$
或包含A.*
或者* *
通配符。这
小路
左右评估参数。通过评估一个路径产生的文档成为评估下一个路径的新值。如果文档中不存在删除的元素,则不是错误;在这种情况下,路径不会影响文档。
mysql> SET @j = '["a", ["b", "c"], "d"]';mysql> SELECT JSON_REMOVE(@j, '$[1]');+-------------------------+ | JSON_REMOVE (@j”,[1美元 ]') | +-------------------------+ | [" ”、“d "] | +-------------------------+
json_replace(
json_doc
那小路
那瓦尔
(,小路
那瓦尔
] ...)替换JSON文档中的现有值并返回结果。回报
零
如果有任何争论零
。如果存在错误json_doc
参数不是有效的JSON文件或任何小路
参数不是有效的路径表达式或包含*
或者* *
通配符。将路径值对左右进行评估。通过评估一对产生的文档成为评估下一个对的新值。
文档中的现有路径的路径值对将使用新值覆盖现有文档值。忽略文档中的非出版路径的路径值对并没有效果。
为了比较
JSON_INSERT ()
那JSON_REPLACE ()
,json_set()
,见讨论json_set()
。mysql> SET @j = '{"a": 1, "b": [2,3]}';mysql>选择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文件或任何小路
参数不是有效的路径表达式或包含*
或者* *
通配符。将路径值对左右进行评估。通过评估一对产生的文档成为评估下一个对的新值。
文档中的现有路径的路径值对将使用新值覆盖现有文档值。如果路径标识以下类型的值之一,则文档中的非主体路径的路径值对将值添加到文档中:
不存在于现有对象中的成员。将成员添加到对象中,并与新值相关联。
超出现有数组尾部的位置。使用新值扩展数组。如果现有值不是数组,则将其自动包装为数组,然后使用新值进行扩展。
否则,文档中不存在的路径的路径值对将被忽略,并且不会产生任何影响。
这
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, '$ ');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 ]} | +-----------------------------------------------------+
unquotes json值并将结果返回为a
utf8mb4
细绳。回报零
如果参数是零
。如果值以双引号开始和结束,但不是有效的JSON字符串文字,则会发生错误。在一个字符串中,某些序列具有特殊意义,除非
NO_BACKSLASH_ESCAPES
启用SQL模式。每个序列都以反斜杠开始(\
),被称为转义字符。MySQL认识到所示的转义序列表12.23," JSON_UNQUOTE()特殊字符转义序列"。对于所有其他转义序列,忽略反斜杠。也就是说,被逃脱的字符被解释为它不逃脱。例如,\X
只是X
。这些序列区分大小写。例如,\ B.
被解释为退格符,但是\ B
被解释为B.
。下面给出了两个使用这个函数的简单例子:
mysql> SET @j = '"abc"';mysql> SELECT @j, JSON_UNQUOTE(@j);+-------+------------------+ | @ j | JSON_UNQUOTE (@j ) | +-------+------------------+ | " 校正”| | +-------+------------------+ mysql >设置@j = ' [1, 2, 3];mysql> SELECT @j, JSON_UNQUOTE(@j);+-----------+------------------+ | @ j | JSON_UNQUOTE (@j ) | +-----------+------------------+ | [ 1、2、3)|(1、2、3 ] | +-----------+------------------+
下面的一组示例展示了如何做到这一点
JSON_UNQUOTE
处理逃,NO_BACKSLASH_ESCAPES
禁用和启用:mysql>选择@@ sql_mode;+ ------------ + |@@ sql_mode |+ ------------ + ||+ ------------ + MySQL>选择JSON_UNQUOTE('“\\ T \\ U0032”');+ -------------------------- + |json_unquote('“\\ t \\ u0032”'')|+ -------------------------- + |2 | +------------------------------+ mysql> SET @@sql_mode = 'NO_BACKSLASH_ESCAPES'; mysql> SELECT JSON_UNQUOTE('"\\t\\u0032"'); +------------------------------+ | JSON_UNQUOTE('"\\t\\u0032"') | +------------------------------+ | \t\u0032 | +------------------------------+ mysql> SELECT JSON_UNQUOTE('"\t\u0032"'); +----------------------------+ | JSON_UNQUOTE('"\t\u0032"') | +----------------------------+ | 2 | +----------------------------+