MySQL的json处理相关方法
文章目录
- JSON_TABLE
- JSON_UNQUOTE 和JSON_EXTRACT
- JSON_KEYS
- JSON_ARRAYAGG
- JSON_ARRAY
起因:在使用tidb作为检查点的存储模块时,想着tidb兼容mysql,于是借用的langgraph-checkpoint-mysql插件来实现tidb。但在验证过程中发现并不如此,mysql很多处理json的语法tidb无法使用。下面介绍这些语法的功能,下一篇会介绍到底哪里不兼容。
json_table,json_unquote,json_extract,json_keys,json_arrayagg,json_array
在 MySQL 中,这些 JSON 函数用于处理 JSON 类型的数据,方便对 JSON 数据进行提取、转换和聚合等操作。
JSON_TABLE
作用:将 JSON 数据转换为关系表的形式,使得可以像查询普通表一样查询 JSON 数据中的元素,方便进行复杂的查询和分析。
案例:假设有一个 students
表,其中 courses
字段是 JSON 类型,存储了学生所选课程及其成绩。
CREATE TABLE students (id INT PRIMARY KEY,name VARCHAR(50),courses JSON
);INSERT INTO students (id, name, courses) VALUES
(1, 'Alice', '[{"course": "Math", "score": 90}, {"course": "English", "score": 85}]'),
(2, 'Bob', '[{"course": "Math", "score": 80}, {"course": "English", "score": 88}]');-- 使用 JSON_TABLE 展开 courses 字段
SELECT s.id,s.name,jt.course,jt.score
FROM students s,JSON_TABLE(s.courses,'$[*]' COLUMNS (course VARCHAR(50) PATH '$.course',score INT PATH '$.score')) AS jt;
查询结果:
id | name | course | score |
---|---|---|---|
1 | Alice | Math | 90 |
1 | Alice | English | 85 |
2 | Bob | Math | 80 |
2 | Bob | English | 88 |
JSON_TABLE(json_data, -- 输入的 JSON 数据(可以是字段名、JSON 字符串或表达式)row_path_expression -- 行路径表达式,指定从 JSON 中提取“行”的范围COLUMNS (-- 定义输出表的列结构,每个列包含:列名、数据类型、JSON 路径column1 data_type PATH 'json_path1',column2 data_type PATH 'json_path2',...)
) AS table_alias -- 为转换后的表指定别名
row_path_expression
:行路径表达式
- 用 JSON 路径语法指定从 JSON 中哪些部分提取 “行”(每个匹配的元素会成为表中的一行)。
- 常用语法:
$[*]
:匹配 JSON 数组中的所有元素(每个元素作为一行)。$.obj[*]
:匹配 JSON 对象中obj
字段对应的数组的所有元素。
- 示例:
'$[*]'
(解析 JSON 数组的所有元素为行)。
COLUMNS (...)
:定义输出表的列结构
用于指定转换后的关系表包含哪些列,以及每个列的值从 JSON 中的哪个位置提取。每个列的定义格式为:列名 数据类型 PATH 'JSON路径'
JSON_UNQUOTE 和JSON_EXTRACT
JSON_UNQUOTE
作用:移除 JSON 字符串中的引号,将 JSON 格式的字符串转换为普通字符串。
案例:假设从 JSON 数据中提取出来的某个值是带引号的字符串,想要得到不带引号的内容时使用。
JSON_EXTRACT
作用:从 JSON 数据中提取指定路径的元素,可以是标量值(如字符串、数字等),也可以是 JSON 对象或数组。
案例:继续使用上述 students
表,查询学生 Alice
的数学成绩。
查询结果:
name |
---|
John |
SET @json_str = '{"name": "John"}';
- 定义一个名为
@json_str
的用户变量,并赋值为 JSON 格式的字符串{"name": "John"}
。 - 这里的 JSON 字符串表示一个对象,包含一个键值对:
"name"
对应的值是"John"
(注意 JSON 中字符串必须用双引号包裹)。
SELECT JSON_UNQUOTE(JSON_EXTRACT(@json_str, '$.name')) AS name;
这是一个查询语句,包含两个嵌套的 JSON 函数:
(1)JSON_EXTRACT(@json_str, '$.name')
- 作用:从 JSON 数据中提取指定路径的值。
@json_str
是要解析的 JSON 变量(即{"name": "John"}
)。'$.name'
是 JSON 路径,表示 “根节点下的name
字段”($
代表根节点)。- 执行结果:提取到的值是
"John"
(带双引号的 JSON 字符串)。
(2)JSON_UNQUOTE(...)
- 作用:移除 JSON 字符串外层的双引号,将其转换为普通字符串。
- 接收
JSON_EXTRACT
的结果"John"
作为参数,移除引号后得到John
。
(3)AS name
- 给查询结果的列起一个别名
name
,方便阅读。
JSON_KEYS
作用:返回 JSON 对象中的所有键,以 JSON 数组的形式呈现。
案例:假设有一个存储用户信息的 JSON 数据,获取其中所有的键。
SET @user_info = '{"name": "Tom", "age": 25, "email": "tom@example.com"}';
SELECT JSON_KEYS(@user_info) AS keys;
查询结果:
keys |
---|
[“name”, “age”, “email”] |
JSON_ARRAYAGG
作用:将一组值聚合为一个 JSON 数组,常用于分组查询中,将每组内的相关数据聚合成 JSON 数组形式。
案例:统计每个学生所选课程的名称,以 JSON 数组形式呈现。
SELECT name,JSON_ARRAYAGG(course) AS courses
FROM students s,JSON_TABLE(s.courses,'$[*]' COLUMNS (course VARCHAR(50) PATH '$.course')) AS jt
GROUP BY name;
查询结果:
name | courses |
---|---|
Alice | [“Math”, “English”] |
Bob | [“Math”, “English”] |
JSON_ARRAY
作用:将一组值创建为一个 JSON 数组,它与 JSON_ARRAYAGG
的区别在于,JSON_ARRAY
不是聚合函数,是直接创建数组。
案例:创建一个包含多个字符串的 JSON 数组。
SELECT JSON_ARRAY('red', 'green', 'blue') AS colors;
查询结果:
colors |
---|
[“red”, “green”, “blue”] |