当前位置: 代码网 > 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)

相关文章:

  • MySQL之搜索引擎使用解读

    mysql的存储引擎是什么mysql当中数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制,索引技巧 锁定水平,以及最终提供的不同的功能和能力,这些就是我们说的存储引…

    2025年09月27日 数据库
  • Docker MySQL启动问题及解决过程

    Docker MySQL启动问题及解决过程

    问题概述docker 环境中的 mysql 容器启动失败,主要表现为两个核心错误:临时文件权限问题:can't create/write to file '/t... [阅读全文]
  • MySQL误删数据或者丢失?这6种方案能帮你快速恢复!

    前言最近星球中有位小伙伴说:他不小心把测试环境mysql表中所有数据都误删了,问我要如何快速恢复?幸好他误删的是测试环境,非生产环境。我遇到过,之前有同事把生产环境会员表中的数据误…

    2025年09月27日 数据库
  • Nginx配置proxy protocol代理获取真实ip的全过程

    前言在现代开发中有很多场景需要拿到用户的真实ip,比如安全策略,和地区热点信息推送等功能,但是现在代理很多。用户可能会通过代理访问服务,或者黑客攻击的时候也会使用很多肉机隐藏其真实…

    2025年09月26日 数据库
  • CentOS中设置yum源的详细步骤

    CentOS中设置yum源的详细步骤

    在centos中设置yum源可以分为以下几个步骤。我将以设置阿里云镜像源为例进行说明:1. 备份原有yum源# 备份原有repo文件sudo cp -r /et... [阅读全文]
  • MySQL从视图到用户和权限管理操作

    一:视图的定义视图是⼀个虚拟的表,它是基于⼀个或多个基本表或其他视图的查询结果集。视图本⾝不存储数据,⽽是通过执⾏查询来动态⽣成数据。⽤⼾可以像操作普通表⼀样使⽤视图进⾏查询、更新…

    2025年09月26日 数据库

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

发表评论

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