起因:在使用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”] |
到此这篇关于mysql中的json处理相关方法详解的文章就介绍到这了,更多相关mysql json处理内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论