当前位置: 代码网 > it编程>数据库>Mysql > MySQL中列值分割的几种方法

MySQL中列值分割的几种方法

2025年09月29日 Mysql 我要评论
版本:mysql 8.xmysql 没有 split() 这样的函数,但可以用 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 列值分割内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com