MySQL的json处理相关方法

文章目录

起因:在使用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 类型,存储了学生所选课程及其成绩。

sql 复制代码
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
sql 复制代码
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
  1. SET @json_str = '{"name": "John"}';
  • 定义一个名为 @json_str 的用户变量,并赋值为 JSON 格式的字符串 {"name": "John"}
  • 这里的 JSON 字符串表示一个对象,包含一个键值对:"name" 对应的值是 "John"(注意 JSON 中字符串必须用双引号包裹)。
  1. 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"]
相关推荐
Kapaseker1 小时前
Compose 进阶—巧用 GraphicsLayer
android·kotlin
黄林晴1 小时前
Android17 为什么重写 MessageQueue
android
阿巴斯甜1 天前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker1 天前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95271 天前
Andorid Google 登录接入文档
android
黄林晴1 天前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab2 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿2 天前
Android MediaPlayer 笔记
android
Jony_2 天前
Android 启动优化方案
android
阿巴斯甜2 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android