一、json_extract 提取指定数据
mysql json_extract() 函数在 json 文档提取路径表达式指定的数据并返回。
语法:
json_extract(json, path, ...)
参数说明:
- json:必需的。一个 json 文档。
- path:必需的。至少指定一个路径表达式。
返回值:
- 返回 json 文档中由路径表达式匹配的所有的值。
- 返回null情况:
- 不存在指定的路径。
- 任意一个参数为
null。
- 报错情况:
json不是有效的 json 文档。path不是有效的路径表达式。
示例:
select json_extract('[1, 2, {"x": 3}]', '$[1]'); // 2
select json_extract('[1, 2, {"x": 3}]', '$[2]'); // {"x": 3}二、json_unquote 取消双引号
mysql json_unquote() 函数取消双引号引用 json 值,并将结果作为字符串返回。
语法:
json_unquote(json_val)
参数说明:
json_val:必需的。一个字符串。
返回值:
- 取消双引号引用 json 值
- 返回null情况:参数为
null。 报错情况:不是有效的 json 字符串文本。能够识别下表中的转义字符:- \":双引号
" \b:退格字符\f:换页符\n:换行符\r:回车符\t:制表符\\:反斜杠 \\uxxxx:unicode 值 xxxx 的 utf-8 字节
- \":双引号
示例:
select json_unquote('"123456"'); // 123456
select json_unquote(cast('"cxian"' as json)); // cxian三、json_keys 取成员的数组
mysql json_keys() 函数返回一个包含了指定的 json 对象中最上层的成员 (key) 的数组。
语法:
json_keys(json) json_keys(json, path)
参数说明:
json:必需的。一个 json 对象文档。path:可选的。路径表达式。
返回值:
- 返回一个包含了指定的 json 对象中最上层的成员 (key) 的数组。
- 若指定了路径表达式,则返回路径表达式匹配的 json 对象中的最上层的成员组成的数组。
- 返回
null情况:- 无路径,json 文档不是一个 json 对象。
- 有路径,路径匹配的 json 值不是 json 对象。
- 任意参数为
null。
- 报错情况:
-
json不是有效的 json 文档。 path不是有效的路径表达式。
-
示例:
select json_keys('{"a": 1, "b": 2, "c": 3}'); // ["a", "b", "c"]
select json_keys('[1, {"a": 1, "b": 2, "c": 3}]', '$[1]'); // ["a", "b", "c"]
select
json_keys('1'), // null
json_keys('"true"'), // null
json_keys('"abc"'), // null
json_keys('[0, 1]'); // null
四、json_array 将参数转为数组
mysql json_array() 函数返回一个包含了所有参数的 json 数组。
语法:
json_array(value1[, value2[, ...]])
参数说明:
value1[, value2[, ...]]:可选的。一些值,他们将被放在 json 数组中。
返回值:
- 包含了所有参数的 json 数组。
- 值转换情况:
- true 被转换为 true
- false 被转换为 false
- null 被转换为 null
- 日期,时间,日期时间 被转换为 字符串
示例:
select json_array(1, '1', null, true, false, now()); // [1, "1", null, true, false, "2023-11-05 16:58:34.000000"]
select json_array(json_array(1, 2), json_array('a', 'b')); // [[1, 2], ["a", "b"]]五、json_object 参数转为对象
mysql json_object() 函数返回一个包含了由参数指定的所有键值对的 json 对象。
语法:
json_object(key, value[, key2, value2, ...])
参数说明:
- key:必需的。对象中的键。
- value:必需的。对象中的 key 的值。
返回值:
- 一个包含了所有键值对的 json 对象。
- 报错情况:
key是null。- 奇数个参数。
示例:
select json_object('name', 'cxian', 'age', 22); // {"age": 22, "name": "cxian"}
select json_object('name', 'cxian', 'age', 22, 'age', 33); // {"age": 33, "name": "cxian"}
六、json_depth 取json深度
mysql json_depth() 函数返回一个 json 文档的最大深度。
语法:
json_depth(json)
参数说明:
json:必需的。一个 json 文档。
返回值:
- 一个 json 文档的最大深度。规则如下:
- 空的数组、空的对象或者纯值的深度是 1。
- 仅包含深度为 1 的元素的数组的深度是 2。
- 所有成员的值的深度为 1 的对象的深度是 2。
- 其他 json 文档的深度都大于 2。
- 返回
null情况:参数为null。 报错情况:参数不是有效的 json 文档。
示例:
select
json_depth('[]'), // 1
json_depth('[1, 2]'), // 2
json_depth('[1, [2, 3]]'); // 3七、json_length 取节点长度
mysql json_length() 函数返回 json 文档或者 json 文档中通过路径指定的节点的长度。
语法:
json_length(json) json_length(json, path)
参数说明:
json:必需的。一个 json 文档。path:可选的。一个路径表达式。
返回值:
- 有path: 返回 json 文档中由路径指定的值的长度。
- 无path:返回 json 文档的长度。
- 计算 json 文档的长度规则:
- 纯值的长度是 1。
- 数组的长度是数组元素的数量。
- 对象的长度是对象成员的数量。
- 内嵌的数组或对象不参与计算长度。
- 返回
null情况:- 不存在指定的路径。
- 任意一个参数为
null。
- 报错情况:
json不是有效的 json 文档。path不是有效的路径表达式。path中包含*或**。
示例:
select
json_length('1'), // 1
json_length('true'), // 1
json_length('false'), // 1
json_length('null'), // 1
json_length('"a"'); // 1
json_length('[]'), // 0
json_length('[1, 2]'), // 2
json_length('[1, {"x": 2}]'); // 2八、json_contains 判断是否包含
mysql json_contains() 函数检查一个 json 文档中是否包含另一个 json 文档。
语法:
json_contains(target_json, candidate_json) json_contains(target_json, candidate_json, path)
参数说明:
target_json必需的。一个 json 文档。candidate_json:必需的。被包含的 json 文档。path:可选的。一个路径表达式。
返回值:
- 包含:返回1。
- 不包含:返回0。
- 返回
null情况:- json 文档中不存在指定的路径。
- 任意一个参数为
null。
- 报错情况:
json不是有效的 json 文档。path不是有效的路径表达式。
示例:
select
json_contains('[1, 2, {"x": 3}]', '1'), // 1
json_contains('[1, 2, {"x": 3}]', '{"x": 3}'), // 1
json_contains('[1, 2, {"x": 3}]', '3'), // 0
json_contains('[1, 2, [3, 4]]', '2'), // 1
json_contains('[1, 2, [3, 4]]', '2', '$[2]'); // 0
九、json_array_append 追加值
mysql json_array_append() 函数向 json 文档中的指定的数组中追加一个值并返回修改后的 json 文档。
语法:
json_array_append(json, path, value[, path2, value2] ...)
参数说明:
json:必需的。被修改的 json 文档。path:必需的。添加新元素的路径。一个有效的路径表达式,它不能包含*或**。value:必需的。被添加到数组的新元素值。
返回值:
- 追加后的 json 文档。
- 返回
null情况:json 文档或者路径为null。 报错情况:json不是有效的 json 文档。path不是有效的路径表达式或者其中包含*或**。
示例:
select json_array_append('[1, 2, 3]', '$', 4); // [1, 2, 3, 4]
select json_array_append('[1, [2, 3]]', '$[0]', 4); // [[1, 4], [2, 3]]
select json_array_append('[1, [2, 3]]', '$[1]', 4); // [1, [2, 3, 4]]
select json_array_append('{"name": "tim", "hobby": ["car"]}', '$.hobby', "food"); // {"name": "tim", "hobby": ["car", "food"]}
select json_array_append('1', '$', 2); // [1, 2]
十、json_array_insert 指定位置插入值
mysql json_array_insert() 函数向 json 文档中的指定的数组中的指定位置插入一个值并返回新的 json 文档。
语法:
json_array_insert(json, path, value[, path2, value2] ...)
参数说明:
json:必需的。被修改的 json 文档。path:必需的。插入新元素的数组元素位置。一个有效的路径表达式,它不能包含*或**。比如$[0]和$.a[0]表示在数组的开头插入新元素。value:必需的。被插入到数组的新元素值。
返回值:
- 插入后的json文档。
- 返回
null情况:json 文档或者路径为null。 报错情况:json不是有效的 json 文档。path不是有效的路径表达式或者其中包含*或**。path指示的不是数组元素的路径。
示例:
set @str = '[1, [2, 3], {"a": [4, 5]}]'
select
json_array_insert(@str, '$[0]', 0), // [0, 1, [2, 3], {"a": [4, 5]}]
json_array_insert(@str, '$[1]', 0), // [1, 0, [2, 3], {"a": [4, 5]}]
json_array_insert(@str, '$[2]', 0), // [1, [2, 3], 0, {"a": [4, 5]}]
json_array_insert(@str, '$[1][0]', 0), // [1, [0, 2, 3], {"a": [4, 5]}]
json_array_insert(@str, '$[2].a[0]', 0); // [1, [2, 3], {"a": [0, 4, 5]}]十一、json_contains_path 判断是否存在
mysql json_contains_path() 函数检查一个 json 文档中在指定的路径上是否有值存在。
语法:
json_contains_path(json, one_or_all, path[, path])
参数说明:
json:必需的。一个 json 文档。one_or_all:必需的。可用值:'one','all'。它指示是否检查所有的路径。path:必需的。您应该至少指定一个路径表达式。
返回值:
- 有值返回 1, 否则返回 0。
- one_or_all参数说明:
- 'one':任意一个路径上有值,返回1,否则返回 0。
- 'all':所有路径都有值,返回1,否则返回 0。
- 报错情况:
json不是有效的 json 文档。path不是有效的路径表达式。
示例:
select
json_contains_path('[1, 2, {"x": 3}]', 'all', '$[0]'), // 1
json_contains_path('[1, 2, {"x": 3}]', 'all', '$[3]'), // 0
json_contains_path('[1, 2, {"x": 3}]', 'all', '$[2].x'), // 1
json_contains_path('[1, 2, {"x": 3}]', 'one', '$[0]', '$[3]'), // 1
json_contains_path('[1, 2, {"x": 3}]', 'all', '$[0]', '$[3]'); // 0
十二、json_insert 插入数据
mysql json_insert() 函数向一个 json 文档中插入数据并返回新的 json 文档。
语法:
json_insert(json, path, value[, path2, value2] ...)
参数说明:
json:必需的。被修改的 json 文档。path:必需的。一个有效的路径表达式,它不能包含*或**。value:必需的。被插入的数据。
返回值:
- 插入后的json文档。(若已存在, 则不插入)
path为$:返回原json文档。- 返回
null情况:json 文档或者路径为null。 报错情况:json不是有效的 json 文档。path不是有效的路径表达式或者其中包含*或**。
示例:
set @arr = '[1, [2, 3], {"a": [4, 5]}]';
select json_insert(@arr, '$[0]', 0, '$[3]', 6); // [1, [2, 3], {"a": [4, 5]}, 6]
set @obj = '{"x": 1}';
select json_insert(@obj, '$.y', '2'); // {"x": 1, "y": "2"}十三、json_merge 多个json合并
mysql json_merge() 函数合并两个或多个 json 文档并返回合并的结果。
语法:
json_merge(json1, json2, ...)
参数说明:
json1:必需的。一个 json 对象文档。json2:必需的。一个 json 对象文档。
返回值:
- 合并后的新json文档。
- 返回
null情况:任意一个参数为null。 - 报错情况:参数不是有效的 json 文档。
示例:
select json_merge('1', 'true', '"hello"', 'null'); // [1, true, "hello", null]
select json_merge('[1, 2]', '[2, 3]'); // [1, 2, 2, 3]
select json_merge('{"x": 1}', '{"x": 2, "y": 3}'); // {"x": [1, 2], "y": 3}
select json_merge('{"x": 1}', '[1, 2]'); // [{"x": 1}, 1, 2]
十四、json_merge_patch 多个json替换合并
mysql json_merge_patch() 函数对两个或多个 json 文档执行替换合并并返回合并的结果。
替换合并:在相同键值时,只保留后面的值。
语法:
json_merge_patch(json1, json2, ...)
参数说明:
json1:必需的。一个 json 对象文档。json2:必需的。一个 json 对象文档。
返回值:
- 合并后的json文档。
- 合并规则如下:
- 若第一个参数不是对象,则合并的结果与第二个参数合并空对象的结果相同。
- 若第二个参数不是对象,则合并的结果为第二个参数。
- 若两个参数都是对象,则合并的对象具有以下成员:
- 只存在于第一个对象中的成员。
- 只存在于第二个对象中且值不是
null的成员。 - 存在于第二个对象且值不是
null,并且在第一个对象中有对应的相同键的成员。
- 返回
null情况:任意一个参数为null。 报错情况:任意一个参数不是有效的 json 文档。
示例:
select
json_merge_patch('2', 'true'), // true
json_merge_patch('[1, 2]', '[2, 3]'), // [2, 3]
json_merge_patch('{"x": 1, "z": 7}', '{"x": 2, "y": 3}'), // {"x": 2, "y": 3, "z": 7}
json_merge_patch('{"x": 1, "z": 7}', '{"x": 2, "z": null}'); // {"x": 2}十五、json_merge_preserve 多个json合并
mysql json_merge_preserve() 函数合并两个或多个 json 文档并返回合并的结果。
此函数和 json_merge_patch() 用法相同,但是合并逻辑有所不同。
不同规则合并如下:
- 两个数组合并为一个数组,保留所有数组中的元素。
- 两个对象合并为一个对象,保留所有的键和值。
- 一个纯值会被包装成一个数组并作为数组进行合并。
- 对象和数组合并时,会将对象包装到一个数组中并作为数组进行合并。
示例:
select
json_merge_preserve('2', 'true'), // [2, true]
json_merge_preserve('[1, 2]', '[2, 3]'), // [1, 2, 2, 3]
json_merge_preserve('{"x": 1, "z": 7}', '{"x": 2, "y": 3}'), // {"x": [1, 2], "y": 3, "z": 7}
json_merge_preserve('{"x": 1, "z": 7}', '{"x": 2, "z": null}'); // {"x": [1, 2], "z": [7, null]}
十六、json_overlaps 判断有无相同键或值
mysql json_overlaps() 函数检测两个 json 文档是否拥有任何一个相同键值对或数组元素。
语法:
json_overlaps(json1, json2)
参数说明:
json1:必需的。一个 json 文档。json2:必需的。另一个 json 文档。
返回值:
- 两个json文档重叠的内容返回 1,否则返回 0。
- 函数判断规则如下:
- 比较两个数组时,如果两个数组至少有一个相同的元素返回
1,否则返回0。 - 比较两个对象时,如果两个对象至少有一个相同的键值对返回
1,否则返回0。 - 比较两个纯值时,如果两个值相同返回
1,否则返回0。 - 比较纯值和数组时,如果值是这个数组中的直接元素返回
1,否则返回0。 - 比较纯值和对象的结果为
0。 - 比较数组和对象的结果为
0。
- 比较两个数组时,如果两个数组至少有一个相同的元素返回
- 返回
null情况:参数为null。 报错情况:任意一个参数不是有效的 json 文档。
示例:
select
json_overlaps('[1, 2, 3]', '[3, 4, 5]'), // 1
json_overlaps('[1, 2, [3]]', '[3, 4, 5]'), // 0
json_overlaps('{"x": 1}', '{"x": 1, "y": 2}'), // 1
json_overlaps('{"x": 1}', '{"y": 2}'), // 0
json_overlaps('[1, 2, 3]', '3'), // 1
json_overlaps('[1, 2, [3]]', '3'); // 0
十七、json_pretty 格式化输出
mysql json_pretty() 函数格式化输出一个 json 文档,以便更易于阅读。
语法:
json_pretty(json)
参数说明:
json:必需的。一个 json 文档或 json 类型的值。
返回值:
- 格式化输出json文档,易于阅读。
示例:
select json_pretty('[1, 2, 3]');
[
1,
2,
3
]
select json_pretty('{"x": 1, "y": 2}');
{
"x": 1,
"y": 2
}十八、json_remove 删除指定数据
mysql json_remove() 函数从一个 json 文档中删除由路径指定的数据并返回修改后的 json 文档。
语法:
json_remove(json, path[, path] ...)
参数说明:
json:必需的。一个 json 文档。path:必需的。一个有效的路径表达式,它不能包含*或**。
返回值:
- 删除后的json文档。
- 返回
null情况:json 文档或者路径为null。 报错情况;json不是有效的 json 文档。path不是有效的路径表达式或者等于$或者其中包含*或**
示例:
select
json_remove('[0, 1, 2, [3, 4]]', '$[0]', '$[2]'), // [1, 2]
json_remove('{"x": 1, "y": 2}', '$.x'); // {"y": 2}十九、json_replace 替换数据
mysql json_replace() 函数在一个 json 文档中替换已存在的数据并返回新的 json 文档。
语法:
json_replace(json, path, value[, path2, value2] ...)
参数说明:
json:必需的。被修改的 json 文档。path:必需的。一个有效的路径表达式,它不能包含*或**。value:必需的。新的数据。
返回值:
- 替换后的json文档。
- 回
null情况:json 文档或者路径为null。 - 报错情况:
json不是有效的 json 文档。path不是有效的路径表达式或者其中包含*或**。
示例:
set @arr = '[1, [2, 3]]';
select
json_replace(@arr, '$[0]', 0, '$[2]', 6), // [0, [2, 3]]
json_replace(@arr, '$[0]', 0, '$[1]', 6); // [0, 6]
set @obj = '{"x": 1}';
select
json_replace(@obj, '$.x', 'true', '$.y', 'true'); // {"x": "true"}
json_replace(@obj, '$.x', '[1, 2]'), // {"x": "[1, 2]"}
json_replace(@obj, '$.x', json_array(1,2)); // {"x": [1, 2]}二十、json_schema_valid 验证json文档
mysql json_schema_valid() 函数根据指定的 json 模式验证一个 json 文档,并返回 1 表是验证通过或者返回 0 表示验证不通过。
语法:
json_schema_valid(schema, json_doc)
参数说明:
schema:必需的。一个 json 模式。它必须是一个有效的 json 对象。json_doc:必需的。被验证的 json 文档。
返回值:
-
1:json 文档通过了验证。 -
0:json 文档没有通过验证。 - 返回
null情况:任何一个参数为null。
示例:
set @schema = '{
"type": "object",
"properties": {
"x": {
"type": "number",
"minimum": -128,
"maximum": 127
},
"y": {
"type": "number",
"minimum": -128,
"maximum": 127
}
},
"required": ["x", "y"]
}';
select
json_schema_valid(@schema, '{"x": 1}'), // 0
json_schema_valid(@schema, '{"x": 1, "y": 2}') // 1
二十一、json_schema_validation_report 验证json文档
mysql json_schema_validation_report() 函数根据指定的 json 模式验证一个 json 文档,并返回一个验证报告。
语法:
json_schema_validation_report(schema, json_doc)
参数说明:
schema:必需的。一个 json 模式。它必须是一个有效的 json 对象。json_doc:必需的。被验证的 json 文档。
返回值:
- 验证结果的报告。
- {"valid": true}:验证通过。
- {"valid": false, reason:'...'}:验证不通过,reason为不通过原因。
示例:
set @schema = '{
"type": "object",
"properties": {
"x": {
"type": "number",
"minimum": -90,
"maximum": 90
},
"y": {
"type": "number",
"minimum": -180,
"maximum": 180
}
},
"required": ["x", "y"]
}';
select
json_schema_validation_report(@schema, '{"x": 1}'), // {"valid": false, "reason": "the json document location '#' failed requirement 'required' at json schema location '#'", "schema-location": "#", "document-location": "#", "schema-failed-keyword": "required"}
json_schema_validation_report(@schema, '{"x": 1, "y": 2}') // {"valid": true}
二十二、json_search 查找
mysql json_search() 函数返回一个给定字符串在一个 json 文档中的路径。
语法:
json_search(json, one_or_all, search_str) json_search(json, one_or_all, search_str, escape_char) json_search(json, one_or_all, search_str, escape_char, path)
参数说明:
json:必需的。一个 json 文档。one_or_all:必需的。可用值:'one','all'。 规则如下:'one':返回第一个匹配的路径。'all':返回所有匹配的路径。所有的路径会包装在一个数组内返回。
search_str:必需的。被搜索的字符串。 您可以在search_str参数中使用%和_通配符,就像 like 一样:%匹配任意数量的任意字符。_匹配一个任意字符。
escape_char:可选的。 如果search_str中包含%和_,需要在他们之前添加转移字符。默认是\。path:可选的。只能在此路径下进行搜索。
返回值:
- 一个路径字符串或者由多个路径组成的数组。
- 返回
null情况:- 未搜索到指定的字符串。
- json 文档中不存在指定的
path。 - 任意一个参数为
null。
报错情况:json不是有效的 json 文档。path不是有效的路径表达式。
示例:
set @json = '{
"type": "object",
"properties": {
"x": {
"type": "number",
"minimum": -90,
"maximum": 90
},
"y": {
"type": "number",
"minimum": -180,
"maximum": 180
}
},
"required": ["x", "y"]
}';
select
json_search(@json, 'one','number'), // "$.properties.x.type"
json_search(@json, 'all','number') // ["$.properties.x.type", "$.properties.y.type"]
二十三、json_set 插入或更新数据
mysql json_set() 函数在一个 json 文档中插入或更新数据并返回新的 json 文档。它相当于是 json_insert() 和 json_replace() 的组合。
语法:
json_set(json, path, value[, path2, value2] ...)
参数说明:
json:必需的。被修改的 json 文档。path:必需的。一个有效的路径表达式,它不能包含*或**。value:必需的。要设置的数据。
返回值:
- 插入或更新数据并返回新的 json 文档。规则如下:
- 存在路径:更新。
- 不存在路径:添加。
- 若
value为字符串:直接插入。 - 返回
null情况:json 文档或者路径为null。 报错情况:json不是有效的 json 文档。path不是有效的路径表达式或者其中包含*或**。
示例:
set @obj = '{"x": 1}';
select
json_set(@obj, '$.x', '10', '$.y', '[1, 2]'), // {"x": "10", "y": "[1, 2]"}
json_set(@obj, '$.x', '10', '$.y', '{"z": 2}'), // {"x": "10", "y": "{\"z\": 2}"}
json_set(@obj, '$.x', '10', '$.y', cast('[1, 2]' as json)); // {"x": "10", "y": [1, 2]}二十四、json_storage_free 释放空间
mysql json_storage_free() 函数返回一个 json 列在被 json_set()、json_replace() 或 json_remove() 更新后所释放的空间。
语法:
json_storage_free(json)
参数说明:
json:必需的。一个 json 文档。它可以是一个 json 字符串,或者一个 json 列。
返回值:
- 一个 json 列在被 json_set()、json_replace() 或 json_remove() 更新后所释放的空间。它可以接受一个 json 字符串,或者一个 json 列作为参数。
- 返回 0 情况:
- 参数是一个 json 字符串。
- 列没有被更新过,或不是使用json_set()、json_replace() 或 json_remove() 部分更新。
- 内容在更新后变的更大了
。
- 返回更新后释放的空间:列(数据库表的列)被 json_set()、json_replace() 或 json_remove() 部分更新。
- 返回
null情况:参数为null。 报错情况:json不是有效的 json 文档。
示例:
drop table if exists test;
create table test (
json_col json not null
);
insert into test
values ('{"x": 1, "y": "99"}');
select
json_col, // {"x": 1, "y": "99"}
json_storage_size(json_col), // 24
json_storage_free(json_col) // 0
from
test;
// {"x": 1, "y": "99"} | 24 | 0
update test
set json_col = json_remove(json_col, '$.y');
select
json_col, // {"x": 1}
json_storage_size(json_col), // 24
json_storage_free(json_col) // 11
from
test;二十五、json_storage_size 占用字节数
mysql json_storage_size() 函数返回存储一个 json 文档的二进制表示所占用的字节数。
语法:
json_storage_size(json)
参数说明:
json:必需的。一个 json 文档。它可以是一个 json 字符串,或者一个 json 列。
返回值:
- json 文档的二进制表示所占用的字节数。
- 返回
null:参数为null。 - 报错情况:
json不是有效的 json 文档。
示例:
select
json_storage_size('100'), // 3
json_storage_size('"a"'), // 3
json_storage_size('true'), // 2
json_storage_size('null'); // 2二十六、json_table 提取数据
mysql json_table() 函数从一个指定的 json 文档中提取数据并返回一个具有指定列的关系表。
语法:
json_table(
json,
path columns (column[, column[, ...]])
)
column:
name for ordinality
| name type path string_path [on_empty] [on_error]
| name type exists path string_path
| nested [path] path columns (column[, column[, ...]])
on_empty:
{null | default json_string | error} on empty
on_error:
{null | default json_string | error} on error
参数说明:
json:必需的。一个 json 文档。path:必需的。一个路径表达式。column:必需的。定义一个列。可以使用如下 4 中方式定义列:name for ordinality: 生成一个从 1 开始的计数器列,名字为name。name type path string_path [on_empty] [on_error]: 将由路径表达式string_path指定的值放在名字为name的列中。name type exists path string_path:根据string_path指定的位置是否有值将1或0放在名字为name的列中。nested [path] path columns (column[, column[, ...]]): 将内嵌的对象或者数组中的数据拉平放在一行中。
- on_empty:可选的。如果指定了,它决定了指定路径下没有数据时的返回值:
- null on empty: 如果指定路径下没有数据,json_table() 函数将使用 null,这是默认的行为。
- default value on empty: 如果指定路径下没有数据,json_table() 函数将使用 value。
- error on empty: 如果指定路径下没有数据,json_table() 函数将抛出一个错误。
- on_error:可选的。如果指定了,它决定了处理错误的逻辑:
- null on error: 如果有错误,json_table() 函数将使用 null,这是默认的行为。
- default value on error: 如果有错误,json_table() 函数将使用 value。
- error on error: 如果有错误,json_table() 函数将抛出一个错误。
返回值:
- 具有指定列的关系表。
示例:
select
*
from
json_table(
'[{"x":10,"y":11}, {"y": 21}, {"x": 30}]',
'$[*]'
columns (
id for ordinality,
x int path '$.x' default '100' on empty,
y int path '$.y'
)
) as t;
id x y
+------+-------+--------+
| 1| 10| 11|
+-----------------------+
| 2| 100| 21|
+------+-------+--------+
| 2| 30| null|
+------+-------+--------+
示例说明:
- 路径表达式$[*]: 数组中的每个元素,也就是数组中的那两个对象。
- $[0]:只提取 json 数组中的第 1 元素
- $[1]:只提取 json 数组中的第 2 元素
- 以此类推
- columns 子句定义了关系表中的 3 个列:
- id for ordinality: 列名为 id,列的内容为从 1 开始的自增序列。
- x int path '$.x' default '100' on empty: 当对象中不存在成员 x 或者 x 的值为空时要使用默认值 100。
- y int path '$.y: 列名为 y,列的内容是对应了对象中的成员 y。
- 其中 $.x 和 $.y 中的 $ 代表了当前的上下文对象,也就是数组中的每个对象。
拉平内嵌的数组示例:
select
*
from
json_table(
'[{"x":10,"y":[11, 12]}, {"x":20,"y":[21, 22]}]',
'$[*]'
columns (
x int path '$.x',
nested path '$.y[*]' columns (y int path '$')
)
) as t;
x y
+------+-------+
| 10 | 11 |
| 10 | 12 |
| 20 | 21 |
| 20 | 22 |
+------+-------+示例说明:
- nested path '$.y[*]' columns (y int path '$'):展开
y对应的数组,并将y数组中的每个元素放入名称为y的列中。
拉平内嵌的对象:
select
*
from
json_table(
'[{"x":10,"y":{"a":11,"b":12}},{"x":20,"y":{"a":21,"b":22}}]',
'$[*]'
columns (
x int path '$.x',
nested path '$.y' columns (
ya int path '$.a',
yb int path '$.b'
)
)
) as t;
x ya yb
+------+-------+-------+
| 10 | 11 | 12 |
| 20 | 21 | 22 |
+------+-------+-------+示例说明:
nested path '$.y'子句将对象y中成员提取到 2 列:- 成员
a被提取到列ya。 - 成员
b被提取到列yb。
- 成员
二十七、json_type 取类型
mysql json_type() 函数返回一个给定的 json 值的类型。
语法:
json_type(json_value)
参数说明:
json_value:必需的。一个 json 值。
返回值:(一个 utf8mb4 字符串)
object: json 对象。array: json 数组boolean: json 布尔值null: jsonnull值integer: mysqltinyint,smallint,mediumint,int和bigint类型的值double: mysqldouble和float类型的值decimal: mysqldecimal和numeric类型的值datetime: mysqldatetime和timestamp类型的值date: mysqldate类型的值time: mysqltime类型的值string: mysqlchar,varchar,text,enum和setblob: mysqlbinary,varbinary,blob和bitopaque: 以上之外的类型
示例:
select
json_type('true'), // boolean
json_type('null'), // null
json_type('"abc"'); // string二十八、json_valid 验证有校性
mysql json_valid() 函数返回 0 和 1 来指示给定的参数是否是一个有效的 json 文档。
语法:
json_valid(str)
参数说明:
str:必需的。需要被验证的内容。
返回值:
- 1:是json文档。
- 0:不是json文档。
- 返回
null情况:参数为null。
示例:
select
json_valid(1), // 0
json_valid('1'), // 1
json_valid(true), // 0
json_valid('true'), // 1
json_valid('abc'), // 0
json_valid('"abc"'), // 1
json_valid('{"a": 1}'), // 1
json_valid('{a: 1}'); // 0二十九、json_value 提取指定路径的值
mysql json_value() 函数从一个指定的 json 文档中提取指定路径的值并返回。
语法:
json_value(json, path [returning type] [{null | error | default value} on empty] [{null | error | default value} on error])
参数说明:
json:必需的。一个 json 文档。path:必需的。一个路径表达式。returning type可选的。他决定了返回值的类型。您可以使用下面值中的一个:
floatdoubledecimalsignedunsigneddatetimedatetimeyear(mysql 8.0.22 and later)charjson
{null | error | default value} on empty:可选的。如果指定了,它决定了指定路径下没有数据的返回值:null on empty: 如果指定路径下没有数据,json_value()函数将返回null,这是默认的行为。default value on empty: 如果指定路径下没有数据,json_value()函数将返回value。error on empty: 如果指定路径下没有数据,json_value()函数将抛出一个错误。
{null | error | default value} on error:可选的。如果指定了,它决定了处理错误的逻辑:null on error: 如果有错误,json_value()函数将返回null,这是默认的行为。default value on error: 如果有错误,json_value()函数将返回value。error on error: 如果有错误,json_value()函数将抛出一个错误。
返回值:
- 路径上的数据。
- 报错情况:
json不是有效的 json 文档。path不是有效的路径表达式。
示例:
set @json = '[
{
"name": "cxian",
"age": 22,
},
{
"name": "jie",
"age": 23 }
]';
select
json_value(@json, '$[0].age'), // 22
json_value(@json, '$[1].age'); // 23
json_value(@json, '$[1].age' returning decimal(9,2)), // 23.00
json_value(@json, '$[0].note' default 'nothing' on empty) // nothing三十、member of 是否为数组的元素
mysql member of() 函数检查一个指定的值是否是一个 json 数组中的元素。
语法:
value member of(value, json_array)
参数说明:
value:必需的。一个值。它可以是任意类型。json_array:必需的。一个 json 数组。
返回值:
- 1:json_array中包含value,或 json_array为值且与value相等。
- 0:数组中不包含value。
- 报错情况:
json_array不是有效的 json 文档。
示例:
select
1 member of('[1, 2, "a"]'), // 1
'a' member of('"a"'), // 1
cast('true' as json) member of('true') // 1三十一、json_quote 包装成json串
mysql json_quote() 函数使用双引号包装一个值,使其成为一个 json 字符串值。
语法:
json_quote(str)
参数说明:
str:必需的。一个字符串。
返回值:
- 一个使用双引号包围的 json 字符串值。
- 返回
null情况:参数为null。 - 特殊字符将使用反斜杠转义:
- \":双引号 "
- \b:退格字符
- \f:换页符
- \n:换行符
- \r:回车符
- \t:制表符
- \\:反斜杠 \
- \uxxxx:unicode 值 xxxx 的 utf-8 字节
示例:
select
json_quote('1'), // "1"
json_quote('null'), // "null"
json_quote('"null"') // "\"null\""总结
到此这篇关于轻松上手mysql之json函数实现高效数据查询与操作的文章就介绍到这了,更多相关mysql json函数数据查询与操作内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论