MySQL 5.7及以上版本支持JSON数据类型,但在某些场景下我们需要将JSON数据进行读取、转换或者查询,以满足业务需求。
MySQL 5.7及以上版本支持JSON数据类型,但在某些场景下我们需要将JSON数据进行读取、转换或者查询,以满足业务需求。
以下是MySQL读取JSON转换的方式的完整攻略:
1. 查询JSON对象的属性
可以通过箭头运算符->
或->>
、JSON_EXTRACT
函数查询JSON对象的属性。其中,->
返回JSON属性的文本格式,->>
及JSON_EXTRACT()
返回JSON属性的值。
-- 查询JSON对象中user属性的值
SELECT json->'$.user' as user FROM table;
SELECT json->>'$.user' as user FROM table;
SELECT JSON_EXTRACT(json, '$.user') as user FROM table;
2. 获取JSON属性个数
可以使用JSON_LENGTH
函数获取JSON对象的属性个数。
-- 获取JSON对象属性个数
SELECT JSON_LENGTH(json) as length FROM table;
3. 查询JSON对象的属性并转换为行
可以使用JSON_TABLE
函数将JSON对象的属性转换为行,进而达到检索、过滤、分组和联接等目的。
-- 将JSON对象中id、name属性转换为行
SELECT jt.id, jt.name FROM table,
JSON_TABLE(json, '$' COLUMNS(
id INT PATH '$.id',
name VARCHAR(50) PATH '$.name'
)) as jt;
4. 更新JSON对象属性
可以使用->
或->>
、JSON_SET
或JSON_REPLACE
函数来更新JSON对象的属性。
-- 更新user属性的值
UPDATE table SET json = JSON_SET(json, '$.user', 'updated user') WHERE id = 1;
UPDATE table SET json = JSON_REPLACE(json, '$.user', 'updated user') WHERE id = 1;
SET @json = (SELECT json FROM table WHERE id = 1);
SET @json = JSON_SET(@json, '$.user', 'updated user');
UPDATE table SET json = @json WHERE id = 1;
示例说明
以下分别以查询JSON对象、获取JSON对象属性个数两个场景为示例说明。
示例一:查询JSON对象
以查询JSON对象中score
属性的值为例。假设有一张表user
,其中有一列json
存储了JSON格式的用户信息。
CREATE TABLE user (
id INT PRIMARY KEY,
json JSON
);
表中数据如下:
id | json |
---|---|
1 | {"name": "小明", "score": {"math": 90, "english": 80}} |
2 | {"name": "小红", "score": {"math": 85, "english": 95}} |
现在我们需要查询id
为1的用户的数学成绩,可以使用以下SQL语句:
SELECT json->'$.score.math' as score FROM user WHERE id = 1;
结果:
score |
---|
90 |
示例二:获取JSON对象属性个数
以获取JSON对象属性个数为例。假设有一张表obj
,其中有一列json
存储了JSON格式的数据。
CREATE TABLE obj (
id INT PRIMARY KEY,
json JSON
);
表中数据如下:
id | json |
---|---|
1 | {"name": "obj1", "age": 18} |
2 | {"name": "obj2", "gender": "male", "hobbies": ["reading", "running", "swimming"]} |
现在我们需要查询每条数据的属性个数,可以使用以下SQL语句:
SELECT id, JSON_LENGTH(json) as length FROM obj;
结果:
id | length |
---|---|
1 | 2 |
2 | 3 |
本文标题为:MySQL读取JSON转换的方式
- Mybatis查询返回Map<String,Object>类型实例详解 2023-03-15
- SpringBoot接口如何统一异常处理 2023-02-28
- MyBatisPlus标准数据层CRUD的使用详解 2023-03-11
- SpringBoot文件上传与下载功能实现详解 2023-06-30
- SpringBoot如何使用RateLimiter通过AOP方式进行限流 2022-12-07
- Java基于对象流实现银行系统 2023-05-19
- java使用OGEngine开发2048 2023-12-28
- Java简单实现银行ATM系统 2022-11-16
- 浅谈@FeignClient中name和value属性的区别 2023-02-11
- Spring配置文件的拆分和整合过程分析 2023-06-06