网站首页 > 教程文章 正文
概述
整理数据时,有时候需要把以某分隔符分隔的字符串分割成多行并导入数据库表中,比如:
技术部 刘一,陈二,张三
销售部 李四,王五,赵六,孙七
行政部 周八,吴九,郑十
需要分割成下面的格式放到数据库表中:
技术部 刘一
技术部 陈二
技术部 张三
销售部 李四
销售部 王五
销售部 赵六
销售部 孙七
行政部 周八
行政部 吴九
行政部 郑十
截图字符串的函数
我们先来看看MySQL中的几个函数的使用
1. LEFT(str, length)
LEFT函数用于从一个字符串中提取左侧的字符,提取的字符数由length参数指定。
示例代码如下:
SELECT LEFT('Hello World', 5);
上面的sql将返回字符串'Hello',因为我们指定了从左侧开始截取5个字符。
2. RIGHT(str, length)
RIGHT函数用于从一个字符串中提取右侧的字符,提取的字符数由length参数指定。
SELECT RIGHT('Hello World', 5);
上面的sql将返回字符串'World',因为我们指定了从右侧开始截取5个字符。
3. SUBSTRING_INDEX(str, delim, count)
参数str:被截取的字符串
参数delim:分隔符
参数count:第几个分隔符,为正数时,截取从左往右第几个分隔符左边的内容,为负数时,截取从右往左第几个分隔符右边的内容
SELECT SUBSTRING_INDEX('刘一,陈二,张三', ',', 2);
上面的sql将返回字符串'刘一,陈二',因为我们指定了截取从左往右第2个逗号左边的内容
SELECT SUBSTRING_INDEX('刘一,陈二,张三', ',', -2);
上面的sql将返回字符串'陈二,张三',因为我们指定了截取从右往左第2个逗号右边的内容
如果我们想将'刘一,陈二,张三’分割成三列,那么sql如下:
SELECT SUBSTRING_INDEX('刘一,陈二,张三', ',', 1) as column1,
SUBSTRING_INDEX(SUBSTRING_INDEX('刘一,陈二,张三', ',', 2), ',', -1) as column2,
SUBSTRING_INDEX('刘一,陈二,张三', ',', -1) as column3;
分割成多行
需要借助一张序号从0开始的自增表
CREATE TABLE `auto_increment_table` (
`id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='自增表';
插入连续自增的序号,序号的最大值根据分割行数确定,这里插入15行
insert into auto_increment_table(id) values(0);
insert into auto_increment_table(id) values(1);
insert into auto_increment_table(id) values(2);
insert into auto_increment_table(id) values(3);
insert into auto_increment_table(id) values(4);
insert into auto_increment_table(id) values(5);
insert into auto_increment_table(id) values(6);
insert into auto_increment_table(id) values(7);
insert into auto_increment_table(id) values(8);
insert into auto_increment_table(id) values(9);
insert into auto_increment_table(id) values(10);
insert into auto_increment_table(id) values(11);
insert into auto_increment_table(id) values(12);
insert into auto_increment_table(id) values(13);
insert into auto_increment_table(id) values(14);
创建部门和用户关系表:
CREATE TABLE `test_dept_user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键id',
`dept` varchar(16) NOT NULL DEFAULT '' COMMENT '部门',
`users` varchar(32) NOT NULL DEFAULT '' COMMENT '用户',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='部门和用户关系-测试表';
插入数据:
insert into test_dept_user(dept, users) values('技术部','刘一,陈二,张三');
insert into test_dept_user(dept, users) values('销售部','李四,王五,赵六,孙七');
insert into test_dept_user(dept, users) values('行政部','周八,吴九,郑十');
将部门和用户的关系分割成多行:
select tdu.dept, substring_index(substring_index(tdu.users, ',', ait.id+1), ',', -1) as user
from test_dept_user tdu cross join auto_increment_table ait on ait.id<=length(tdu.users)-length(replace(tdu.users,',',''))
order by tdu.id
此sql的显示结果如下:
若您觉得还可以,请帮忙关注、转发、点赞,谢谢~
猜你喜欢
- 2025-04-26 MySQL数据库入门(四)数据类型简介
- 2025-04-26 面试官:count(*) 怎么优化?
- 2025-04-26 MYSQL经典面试题汇总
- 2025-04-26 Mysql实战总结&面试20问
- 2025-04-26 MySQL 9.3发布,这些新功能太实用!
- 2025-04-26 MySQL体系架构
- 2025-04-26 数据库:MySQL 高性能优化规范建议
- 2025-04-26 MySQL 单表可以放多少数据,最多 2000 万?
- 2025-04-26 Mysql的varchar字段按照数字来排序
- 2025-04-26 一条简单的更新语句,MySQL是如何加锁的?
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- md5 sha1 (32)
- mybatis plus page (35)
- semaphore 使用详解 (32)
- update from 语句 (32)
- vue @scroll (38)
- 堆栈区别 (33)
- 在线子域名爆破 (32)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)