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 小时前
MySQL第四次作业(索引、视图)
数据库·mysql
IT教程资源C6 小时前
(N_083)基于springboot毕业设计管理系统
mysql·springboot毕业管理
计算机小手7 小时前
探索 Maxwell:高效捕获 MySQL 数据变更的轻量级中间件
数据库·经验分享·mysql·开源软件
喝杯牛奶丶11 小时前
MySQL隔离级别:大厂为何偏爱RC?
java·数据库·mysql·面试
Dxy123931021614 小时前
MySQL的UPPER函数介绍
数据库·mysql
api_1800790546014 小时前
请求、认证与响应数据解析:1688 商品 API 接口深度探秘
java·大数据·开发语言·mysql·数据挖掘
yuezhilangniao14 小时前
mysql mogoDB pg redis-四大数据库选型-数据库对比大白话指南
数据库·redis·mysql
南宫乘风1 天前
基于 Flask + APScheduler + MySQL 的自动报表系统设计
python·mysql·flask
Dxy12393102161 天前
MySQL的SUBSTRING函数详解与应用
数据库·mysql
码力引擎1 天前
【零基础学MySQL】第十二章:DCL详解
数据库·mysql·1024程序员节