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 列值分割内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 远程连接mysql数据库注意事项记录(远程连接慢skip-name-resolve)

    远程连接mysql数据库注意事项记录(远程连接慢skip-name-resolve)

    有时候我们需要远程连接mysql数据库,就需要注意下面的问题,方便大家解决,脚本之家小编特为大家准备了一些资料
    2012-07-07
  • MySQL 数据库两台主机同步实战(linux)

    MySQL 数据库两台主机同步实战(linux)

    MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护日志文件的一个索引以跟踪日志循环。
    2009-04-04
  • mysql中数据库覆盖导入的几种方式总结

    mysql中数据库覆盖导入的几种方式总结

    这篇文章主要介绍了mysql中数据库覆盖导入的几种方式总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • MySQL如何基于Explain关键字优化索引功能

    MySQL如何基于Explain关键字优化索引功能

    这篇文章主要介绍了MySQL如何基于Explain关键字优化索引功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • MySQL运算符!=和<>及=和<=>的使用区别

    MySQL运算符!=和<>及=和<=>的使用区别

    本文主要介绍了MySQL运算符!=和<>及=和<=>的使用区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • 简述MySQL分片中快速数据迁移

    简述MySQL分片中快速数据迁移

    这篇文章主要介绍了MySQL分片中快速数据迁移的相关资料,需要的朋友可以参考下
    2016-03-03
  • 重置MySQL中表中自增列的初始值的实现方法

    重置MySQL中表中自增列的初始值的实现方法

    这篇文章主要介绍了重置MySQL中表中自增列的初始值的实现方法的相关资料,需要的朋友可以参考下
    2017-03-03
  • MySQL允许root用户远程连接的步骤记录

    MySQL允许root用户远程连接的步骤记录

    MySQL是一种常用的关系型数据库管理系统,它允许开发人员通过远程连接来访问数据库,这篇文章主要介绍了MySQL允许root用户远程连接的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-07-07
  • mysql timestamp比较查询遇到的坑及解决

    mysql timestamp比较查询遇到的坑及解决

    这篇文章主要介绍了mysql timestamp比较查询遇到的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • MySQL CTE 通用表达式详解

    MySQL CTE 通用表达式详解

    在MySQL中,CTE是一种简洁而强大的语法,用于构建临时的结果集,通常用于简化复杂查询,下面通过本文给大家介绍MySQL CTE 通用表达式,感兴趣的朋友一起看看吧
    2025-06-06

最新评论