摘要
本文介绍了MySQL常用的json_函数,对于解析一些json字段内容有很大的帮助,虽然用起来感觉没那么易用,但还是能解决不少问题,让我们拿下它。
首先说明简单易用的几个json_函数
- JSON_LENGTH()
计算JSON文档的长度。无效的JSON格式,JSON_LENGTH会返回NULL
erlang
-- 返回3 计算JSON数组的长度
SELECT JSON_LENGTH('[1, 2, 3]')
-- 返回1 计算JSON对象的长度
SELECT JSON_LENGTH('{"状态": "正常"}')
-- 返回3 计算嵌套JSON的长度
SELECT JSON_LENGTH('{"name": "John", "details": {"age": 30, "city": "New York"}, "hobbies": ["reading", "traveling"]}')
- JSON_VALID()
验证一个字符串是否是有效的JSON格式
sql
-- 返回 1
SELECT JSON_VALID('[1, 2, 3]');
-- 返回 0(缺少闭合的 ])
SELECT JSON_VALID('[1, 2, 3');
-- 返回 1
SELECT JSON_VALID('{"状态": "正常"}');
-- 一般配合JSON_EXTRACT()使用
CASE WHEN json_valid(json字段)
THEN json_extract(json字段, '$[0]') = 其他内容
ELSE 1 END
- JSON_EXTRACT(json, path)
提取JSON中的值,路径语法如 $.key
css
-- 返回"MySQL"
SELECT JSON_EXTRACT('{"name": "MySQL"}', '$.name');
-- 返回{"id": "我"}
-- $[1] 提取数组索引为1的json数组元素
SELECT JSON_EXTRACT('[{"name": "MySQL"}, {"id": "我"}]', '$[1]');
- JSON_UNQUOTE()
去除JSON字符串的引号(如提取汉字键值时需配合使用)
javascript
-- 返回MySQL
SELECT JSON_UNQUOTE(JSON_EXTRACT('{"name": "MySQL"}', '$.name')) AS name
- JSON_ARRAY()
是MySQL 5.7及以上版本中提供的一个函数,用于创建一个JSON数组
scss
JSON_ARRAY(value1, value2, ..., valueN)
-- 返回 ["1", "2"]
SELECT JSON_ARRAY("1","2")
-- 返回 [1, 2]
SELECT JSON_ARRAY(1,2)
- JSON_CONTAINS()
检查根路径下的是否包含某值
sql
-- json_doc:要检查的JSON文档
-- json_val:要查找的JSON值
-- path(可选):指定在JSON文档的哪个路径下进行查找,默认为根路径 '$'
-- JSON_CONTAINS(json_doc, json_val [, path])
SELECT JSON_CONTAINS(json内容, '${json值}', '$')
-- json_val 是字符串时,需用双引号包裹
-- 返回 1(存在)
SELECT JSON_CONTAINS('["用户", "管理员"]', '"管理员"', '$')
-- json_val 是数字时,需用单引号包裹
SELECT JSON_CONTAINS(json内容, '123', '$')
-- roles 是数组时
SELECT JSON_CONTAINS(json内容, '"管理员"', '$.roles[*]')
重点说明下json_table的用法
- JSON_TABLE()
是MySQL 8.0+引入的函数,用于将JSON数据转换为关系型表格格式,便于通过SQL进行查询、分析和与其他表关联。
sql
-- expr JSON数据的来源,可以是列名、变量或直接的JSON字符串。
-- path 指定要展开的JSON对象或数组的路径(如 $.items[*] 表示展开 items 数组)。
-- COLUMNS 定义生成的列,包括列名、数据类型、JSON路径映射及错误处理规则。
JSON_TABLE(
expr, -- 包含 JSON 数据的表达式(如列名或字符串)
path -- JSON 路径,指定要展开的 JSON 对象或数组
COLUMNS( -- 定义生成的列及其映射规则
column_name column_type PATH 'json_path'
[DEFAULT default_value]
[ERROR ON ERROR | NULL ON ERROR],
...
)
) AS alias
- 举例
sql
-- 假设表 orders包含JSON列order_json:
-- 建表
CREATE TABLE orders (
id INTPRIMARY KEY,
order_json JSON
);
-- 做数据
INSERT INTO orders (id, order_json) VALUES (
1,
'{
"order_id": 1001,
"customer": {"name": "Alice", "email": "alice@example.com"},
"items": [
{"product": "Laptop", "price": 1200},
{"product": "Mouse", "price": 25}
]
}'
);
-- 使用JSON_TABLE解析:
SELECT
jt.order_id,
jt.customer_name,
jt.product,
jt.price
FROM orders,
JSON_TABLE(
order_json, -- 要解析的JSON列
'$' -- 根路径(整个JSON文档) 如果是'$.customer'表示定位到顶层的"customer"对象
COLUMNS (
order_id INT PATH '$.order_id', -- 提取顶层字段
customer_name VARCHAR(50) PATH '$.customer.name', -- 嵌套对象字段
NESTED PATH '$.items[*]' -- 处理items数组
COLUMNS (
product VARCHAR(50) PATH '$.product', -- 提取items里的product字段
price DECIMAL(10,2) PATH '$.price' -- 提取items里的price字段
)
)
) AS jt;
-- 输出
order_id | customer_name | product | price
---------|---------------|---------|-------
1001 | Alice | Laptop |1200.00
1001 | Alice | Mouse | 25.00
总结
以上我们了解了MySQL的常见json函数及用法,以及json_table()的使用场景和用法,虽然易读易用性不高,但对于一个存json内容的场景很有用。
关注公众号:咖啡Beans
在这里,我们专注于软件技术的交流与成长,分享开发心得与笔记,涵盖编程、AI、资讯、面试等多个领域。无论是前沿科技的探索,还是实用技巧的总结,我们都致力于为大家呈现有价值的内容。期待与你共同进步,开启技术之旅。