(目录)
本文涉及函数简介
函数 | 作用 |
---|---|
JSON_ARRAY_APPEND | 在数组后追加元素 |
JSON_ARRAY_INSERT | 在JSON数据中的指定位置插入元素 |
JSON_INSERT | 如果存在值,不操作,否则插入值 |
JSON_REPLACE | 如果存在值,更新该值,否则不操作 |
JSON_SET | 如果存在值,就更新,否则就插入 |
JSON_REMOVE | 如果存在值,就删除,否则无效果 |
JSON_MERGE_PATCH | |
JSON_MERGE_PRESERVE = JSON_MERGE | |
JSON_QUOTE | 将字符串转换为JSON值,对其中的特殊符号进行转义。 |
JSON_UNQUOTE | 将JSON值转换为字符串,并去除其中的转义字符 |
更改JSON的函数
数组相关函数
JSON_ARRAY_APPEND
JSON_ARRAY_APPEND(json_doc, path, val[, path, val] ...)
从JSON文档中查找path路径的内容,然后在其内容的最后追加值,如果path
的类型不是数组,将其视为数组中的一个元素
mysql> select value,JSON_ARRAY_APPEND(value,"$[0]",1),JSON_ARRAY_APPEND(value,"$[1]",3),JSON_ARRAY_APPEND(value,"$[2]","c") from test_json\G
*************************** 1. row ***************************
value: ["a", ["b", "c"], {"d": 5}, "f"]
-- $[0] = "a", 视为 ["a"] 在后方追加1 = ["a", 1]
JSON_ARRAY_APPEND(value,"$[0]",1): [["a", 1], ["b", "c"], {"d": 5}, "f"]
-- $[1] = ["b", "c"] ,在后方追加3 = ["b", "c", 3]
JSON_ARRAY_APPEND(value,"$[1]",3): ["a", ["b", "c", 3], {"d": 5}, "f"]
-- $[2] = {"d": 5} , 视为 [{"d": 5}] 在后方追加"c" = [{"d": 5}, "c"]
JSON_ARRAY_APPEND(value,"$[2]","c"): ["a", ["b", "c"], [{"d": 5}, "c"], "f"]
JSON_ARRAY_INSERT
从JSON文档中查找path路径的内容,如果path是数组中的元素,就将在该位置插入值,其他元素右移,如果path不是数组中的元素,无作用,如果path的位置超过了数组的末尾,就将值插入到数组的末尾
JSON_ARRAY_INSERT(json_doc, path, val[, path, val] ...)
mysql> select value,JSON_ARRAY_INSERT(value,"$[0]",1),JSON_ARRAY_INSERT(value,"$[1]",3),JSON_ARRAY_INSERT(value,"$[1][1]","c"),JSON_ARRAY_INSERT(value,"$[2][0]","c") from test_json\G
*************************** 1. row ***************************
value: ["a", ["b", "c"], {"d": 5}, "f"]
-- "$" 是数组,插入到$[0]的位置
JSON_ARRAY_INSERT(value,"$[0]",1): [1, "a", ["b", "c"], {"d": 5}, "f"]
JSON_ARRAY_INSERT(value,"$[1]",3): ["a", 3, ["b", "c"], {"d": 5}, "f"]
-- "$[1]" = ["b", "c"] 是数组,插入到$[1][1]的位置
JSON_ARRAY_INSERT(value,"$[1][1]","c"): ["a", ["b", "c", "c"], {"d": 5}, "f"]
-- "$[2]" = {"d": 5} 不是数组,插入无效
JSON_ARRAY_INSERT(value,"$[2][0]","c"): ["a", ["b", "c"], {"d": 5}, "f"]
增删改
示例详见参考MySQL8.0 JSON数据类型的更新JSON值部分
JSON_INSERT
JSON_INSERT(json_doc, path, val[, path, val] ...)
如果指定path
不存在内容,插入数据,否则无效果
JSON_REPLACE
JSON_REPLACE(json_doc, path, val[, path, val] ...)
如果指定path
存在内容,更新数据,否则无效果
JSON_SET
JSON_SET(json_doc, path, val[, path, val] ...)
如果指定path
存在内容,更新数据,否则插入数据
JSON_REMOVE
JSON_REMOVE(json_doc, path[, path] ...)
如果指定path
存在内容,删除该内容
合并JSON值
JSON_MERGE_PATCH
JSON_MERGE_PATCH(json_doc, json_doc[, json_doc] ...)
合并多个JSON文档,不保留重复值
合并规则:
- 如果第一个参数不是JSON对象,将空对象和第二个参数合并
- 如果第二个参数不是JSON对象,合并的结果就是第二个对象
- 如果两个参数都是JSON对象,结果如下:
- 如果第一个参数中存在值为null的键,保留键值对
- 如果第二个参数中存在值为null的键,并且该键再第一个参数中存在,删除该键值对
- 具有不同键的值保留原值,具有相同键的值,保留最后一个参数中的值 合并会递归执行,也就是,如果在两个参数中存在相同的键,并且键值都是JSON对象,其中的JSON对象也会进行合并,然后保留最终合并的结果
mysql> SELECT JSON_MERGE_PATCH('[1, 2]', '[true, false]'),JSON_MERGE_PATCH('{"name": "x"}', '{"id": 47}'),JSON_MERGE_PATCH('1', 'true'),JSON_MERGE_PATCH('{ "a": 1, "b":2 }','{ "a": 3, "c":4 }'),JSON_MERGE_PATCH('{"a":null}','{"b":1}'),JSON_MERGE_PATCH('{"a":1,"c":5}','{"c":null}'),JSON_MERGE_PATCH('{"a":{"x":1}}', '{"a":{"y":2}}')\G
*************************** 1. row ***************************
-- 两个数组合并,结果是后一个数组
JSON_MERGE_PATCH('[1, 2]', '[true, false]'): [true, false]
-- 两个JSON对象合并,结果是一个包含两组键值对的JSON对象
JSON_MERGE_PATCH('{"name": "x"}', '{"id": 47}'): {"id": 47, "name": "x"}
-- 数值和布尔值合并,结果是后一个布尔值
JSON_MERGE_PATCH('1', 'true'): true
-- 两个JSON对象合并,由于"a"键在两个文档中都存在,保留后面出现的值=3
JSON_MERGE_PATCH('{ "a": 1, "b":2 }','{ "a": 3, "c":4 }'): {"a": 3, "b": 2, "c": 4}
-- 第一个参数中存在值为null的键值对保留
JSON_MERGE_PATCH('{"a":null}','{"b":1}'): {"a": null, "b": 1}
-- 第二个参数中存在值为null的键,把前一个参数中的键值对也移除
JSON_MERGE_PATCH('{"a":1,"c":5}','{"c":null}'): {"a": 1}
-- 存在子文档,嵌套合并
JSON_MERGE_PATCH('{"a":{"x":1}}', '{"a":{"y":2}}'): {"a": {"x": 1, "y": 2}}
JSON_MERGE_PRESERVE
JSON_MERGE_PRESERVE(json_doc, json_doc[, json_doc] ...)
同义词:JSON_MERGE(json_doc, json_doc[, json_doc] ...)
合并多个JSON文档,保留重复值
合并规则:
- 多个数组合并为一个数组
- 多个对象合并为一个对象
- 其余值被视为存在单个元素的数组,并与数组合并
- 数组和对象合并为一个数组
mysql> SELECT JSON_MERGE_PRESERVE('[1, 2]', '[true, false]'),JSON_MERGE_PRESERVE('{"name": "x"}', '{"id": 47}'),JSON_MERGE_PRESERVE('1', 'true'),JSON_MERGE_PRESERVE('[1, 2]', '{"id": 47}'),JSON_MERGE_PRESERVE('{ "a": 1, "b": 2 }','{ "a": null, "c": 4 }'),JSON_MERGE_PRESERVE('{"a":{"x":1}}', '{"a":{"x":3,"y":2}}') \G
*************************** 1. row ***************************
-- 两个数组合并成一个数组
JSON_MERGE_PRESERVE('[1, 2]', '[true, false]'): [1, 2, true, false]
-- 两个对象合并成一个对象
JSON_MERGE_PRESERVE('{"name": "x"}', '{"id": 47}'): {"id": 47, "name": "x"}
-- 数值和布尔值合并成一个数组,数值和布尔值分别作为数组中的一个元素
JSON_MERGE_PRESERVE('1', 'true'): [1, true]
-- 数组和对象合并成一个数组,对象作为数组中的一个元素
JSON_MERGE_PRESERVE('[1, 2]', '{"id": 47}'): [1, 2, {"id": 47}]
-- 多个对象存在相同键,将键值进行合并。null值不会导致键删除,而是作为数组中的一个元素合并
JSON_MERGE_PRESERVE('{ "a": 1, "b": 2 }','{ "a": null, "c": 4 }'): {"a": [1, null], "b": 2, "c": 4}
-- 存在子文档,嵌套合并
JSON_MERGE_PRESERVE('{"a":{"x":1}}', '{"a":{"x":3,"y":2}}'): {"a": {"x": [1, 3], "y": 2}}
字符串和JSON格式转换
JSON_QUOTE
JSON_QUOTE(string)
将字符串转换为JSON值,对其中的特殊符号进行转义。
mysql> SELECT JSON_QUOTE('null'), JSON_QUOTE('"null"'),JSON_QUOTE('[1, 2, 3]')\G
*************************** 1. row ***************************
JSON_QUOTE('null'): "null"
JSON_QUOTE('"null"'): "\"null\""
JSON_QUOTE('[1, 2, 3]'): "[1, 2, 3]"
JSON_UNQUOTE
取消JSON值外的引号以及内部的转义字符并以utf8mb4
字符串的形式返回结果。是JSON_QUOTE
的反向转换
JSON_UNQUOTE(json_val)
mysql> select JSON_UNQUOTE("NULL"),JSON_UNQUOTE("\"null\""),JSON_UNQUOTE("[1, 2, 3]")\G
*************************** 1. row ***************************
JSON_UNQUOTE("NULL"): NULL
JSON_UNQUOTE("\"null\""): null
JSON_UNQUOTE("[1, 2, 3]"): [1, 2, 3]
特殊字符说明
转义字符区分大小写,如果不是JSON_UNQUOTE
函数支持的转义字符,会忽略反斜杠,直接返回后面的字符,例如\b
等同于退格符,但是\B
等同于B
JSON_UNQUOTE
函数支持的转义字符表
转义后 | 转义前 |
---|---|
\" |
双引号" |
\b |
退格符(Backspace) |
\f |
换页符 |
\n |
换行符(Enter) |
\r |
回车符 |
\t |
水平制表符(Tab) |
\\ |
反斜杠\ |
\uXXXX |
Unicode值为XXXX的UTF-8字节 |