MySQL的JSON_函数总结

摘要

本文介绍了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、资讯、面试等多个领域。无论是前沿科技的探索,还是实用技巧的总结,我们都致力于为大家呈现有价值的内容。期待与你共同进步,开启技术之旅。

相关推荐
神仙别闹4 小时前
基于Java(Spring Boot)+MySQL实现电商网站
java·spring boot·mysql
hacker_LeeFei4 小时前
Springboot连接多数据源(MySQL&Oracle)
spring boot·mysql·oracle
潇凝子潇5 小时前
MySQL Redo Log 和 Undo Log 满了会有什么问题
数据库·mysql
周杰伦_Jay7 小时前
【Homebrew安装 MySQL 】macOS 用 Homebrew 安装 MySQL 完整教程
数据库·mysql·macos
贝多芬也爱敲代码13 小时前
如何减小ES和mysql的同步时间差
大数据·mysql·elasticsearch
安当加密14 小时前
MySQL数据库透明加密(TDE)解决方案:基于国密SM4的合规与性能优化实践
数据库·mysql·性能优化
007php00714 小时前
某大厂跳动面试:计算机网络相关问题解析与总结
java·开发语言·学习·计算机网络·mysql·面试·职场和发展
JH307315 小时前
第七篇:Buffer Pool 与 InnoDB 其他组件的协作
java·数据库·mysql·oracle
阿沁QWQ16 小时前
MySQL服务器配置与管理
服务器·数据库·mysql