MySQL中列值分割的几种方法

 更新时间:2025年09月29日 10:28:00   作者:一一Null  
这篇文章主要介绍了MySQL中列值分割的几种方法,针对不同场景提供SUBSTRING_INDEX、JSON_TABLE、正则表达式等多种解决方案,下面就来详细的介绍一下,感兴趣的可以了解一下

版本:MySQL 8.x

MySQL 没有 split() 这样的函数,但可以用 SUBSTRING_INDEXJSON_TABLE 实现“按分隔符拆列”。
下面给出 官方推荐 + 实战写法,每个都能直接复制运行。

1. 核心函数速览

函数作用一句话语法
SUBSTRING_INDEX(str, delim, n)返回第 n 个分隔符前/后的子串SUBSTRING_INDEX('a,b,c',',',2) → ‘a,b’
JSON_TABLE(json, path COLUMNS(…))把 JSON 数组拆成行见案例 4
REGEXP_SUBSTR / REGEXP_REPLACE正则切分/替换MySQL 8 支持,见案例 5

2. 案例实验室

准备一张表:

CREATE TABLE orders (
  id INT PRIMARY KEY,
  items VARCHAR(100)   -- 用逗号分隔的商品串
);

INSERT INTO orders VALUES
(1,'苹果,香蕉,橙子'),
(2,'芒果'),
(3,'桃子,葡萄'),
(4,'');

案例 1 SUBSTRING_INDEX 取第 1、2、3 个元素

SELECT id,
       SUBSTRING_INDEX(items, ',', 1)                         AS item1,
       SUBSTRING_INDEX(SUBSTRING_INDEX(items, ',', 2), ',', -1) AS item2,
       SUBSTRING_INDEX(items, ',', -1)                        AS item_last
FROM orders;
iditem1item2item_last
1苹果香蕉橙子
2芒果芒果芒果
3桃子葡萄葡萄
4

案例 2 一行变多行(数字表法)

用递归数字表(MySQL 8 CTE)把任意长度的逗号串拆成行。

WITH RECURSIVE nums(n) AS (
  SELECT 1 UNION ALL SELECT n+1 FROM nums WHERE n<20
)
SELECT o.id, o.items,
       TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(o.items, ',', n), ',', -1)) AS item
FROM orders o
JOIN nums
  ON n <= 1 + LENGTH(o.items) - LENGTH(REPLACE(o.items, ',', ''));

结果

iditemsitem
1苹果,香蕉,橙子苹果
1苹果,香蕉,橙子香蕉
1苹果,香蕉,橙子橙子
2芒果芒果
3桃子,葡萄桃子
3桃子,葡萄葡萄

案例 3 JSON_TABLE(8.0 最优雅)

把逗号串先转成 JSON,再拆成行。

SELECT o.id, t.item
FROM orders o,
JSON_TABLE(
  CONCAT('["', REPLACE(items, ',', '","'), '"]'),  -- 变成 ["苹果","香蕉","橙子"]
  "$[*]" COLUMNS(item VARCHAR(20) PATH "$")
) AS t;

结果与案例 2 完全一致,但写法更短更清晰。

案例 4 正则切分(REGEXP_SUBSTR)

按任意正则分隔符拆列。

SELECT id,
       REGEXP_SUBSTR(items, '[^,]+', 1, 1) AS item1,
       REGEXP_SUBSTR(items, '[^,]+', 1, 2) AS item2,
       REGEXP_SUBSTR(items, '[^,]+', 1, 3) AS item3
FROM orders;
iditem1item2item3
1苹果香蕉橙子
2芒果NULLNULL
3桃子葡萄NULL
4NULLNULLNULL

3. 课堂小结

场景推荐方案
已知固定位置SUBSTRING_INDEX 一步到位
任意长度串 → 行递归 CTE + SUBSTRING_INDEX
MySQL 8.0JSON_TABLE 最优雅
复杂正则REGEXP_SUBSTR / REGEXP_REPLACE

到此这篇关于MySQL中列值分割的几种方法的文章就介绍到这了,更多相关MySQL 列值分割内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Win7x64下Mysql5.7.18解压版的安装方法

    Win7x64下Mysql5.7.18解压版的安装方法

    这篇文章主要介绍了Win7x64下Mysql5.7.18解压版的安装方法,需要的朋友可以参考下
    2017-07-07
  • MYSQL增加索引语句小结

    MYSQL增加索引语句小结

    这篇文章主要给大家介绍了关于MYSQL增加索引的相关资料,索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针,需要的朋友可以参考下
    2023-09-09
  • MySQL数据库的备份与还原操作方法

    MySQL数据库的备份与还原操作方法

    这篇文章主要介绍了MySQL数据库的备份与还原操作方法,文章围绕主题展开详细的内容加入,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-06-06
  • 关于MySQL innodb_autoinc_lock_mode介绍

    关于MySQL innodb_autoinc_lock_mode介绍

    下面小编就为大家带来一篇关于MySQL innodb_autoinc_lock_mode介绍。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • 在linux中导入sql文件的方法分享(使用命令行转移mysql数据库)

    在linux中导入sql文件的方法分享(使用命令行转移mysql数据库)

    为使用阿里云主机,没有装ftp,也没有装phpmyadmin,所以一切都得靠命令行。转移网站的重要一步就是转移数据库,这里简单介绍一下如何在这种情况下导入sql文件
    2014-02-02
  • MySQL命令行下如何执行.sql脚本

    MySQL命令行下如何执行.sql脚本

    这篇文章主要介绍了MySQL命令行下如何执行.sql脚本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Linux中部署MySQL环境的四种方式图文详解

    Linux中部署MySQL环境的四种方式图文详解

    这篇文章主要介绍了Linux中部署MySQL环境的四种方式,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-11-11
  • mysql如何显示longblob解决方案

    mysql如何显示longblob解决方案

    这篇文章主要为大家介绍了mysql如何显示longblob解决方案,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 一篇文章带你了解MySQL之undo日志

    一篇文章带你了解MySQL之undo日志

    Undo日志也叫做回滚日志,是MySQL数据库当中一种重要的日志,用于记录更新操作之前的数据状态,这篇文章主要给大家介绍了关于如何通过一篇文章带你了解MySQL之undo日志的相关资料,需要的朋友可以参考下
    2023-06-06
  • Mysql中的Innodb事务和锁详解

    Mysql中的Innodb事务和锁详解

    这篇文章主要介绍了Mysql中的Innodb事务和锁详解,InnoDB是MySQL的一种存储引擎,它是一种可靠性和性能非常好的存储引擎,它具有ACID事务支持,可以提供高并发性和数据完整性,需要的朋友可以参考下
    2023-09-09

最新评论