弁言
截取和拆分字符串在编程生存中是广泛存在的,在sql中也不例外,下面就让我们来一起探索mysql中字符串的截取和拆分吧。
截取字符串
一、left(str,length)
从左边截取字符串,参数str:被截取的字符串,length:截取的长度
- SELECT LEFT('中华人民共和国从此站起来了',7);
复制代码 截取效果:
二、right(str,length)
从右边截取字符串,参数str:被截取的字符串,length:截取的长度
- SELECT RIGHT('中华人民共和国从此站起来了',6);
复制代码 截取效果:
三、截取特定长度的字符串
有两种用法: substring(str,pos)
参数str:被截取的字符串,pos从第几位开始截取,当为正数时从左开始数,当为负数时,从右开始数,从第几位开始截取,直至字符串结束;
substring(str,pos,length)
参数str:被截取的字符串,pos从第几位开始截取,当为正数时从左开始数,当为负数时,从右开始数,从第几位开始截取,向右截取length个字符。
1.从字符串第n个字符开始到结束
- SELECT SUBSTRING('abcdefg',3);
复制代码 截取效果:
cdefg
2.从字符串第3个字符开始,只截取4位
- SELECT SUBSTRING('abcdefg',3,4);
复制代码 截取效果:
cdef
3.从字符串倒数第3个字符开始至结束
- SELECT SUBSTRING('abcdefg',-3);
复制代码 截取效果:
efg
4.从字符串倒数第3个字符开始,只截取2位
- SELECT SUBSTRING('abcdefg',-3,2);
复制代码 截取效果:
ef
四、按分隔符截取
SUBSTRING_INDEX(str,delim,count)
参数str:被截取的字符串;
参数delim:分隔符;
参数count:第几个分隔符,为正数时,截取从左往右第几个分隔符左边的内容,为负数时,截取从右往左第几个分隔符右边的内容。
1.截取第1个 "-"之前的全部字符
- SELECT SUBSTRING_INDEX('100-200-300-400', '-', 1);
复制代码 截取效果:
100
2.截取倒数第1个"-"之后的全部字符
- SELECT SUBSTRING_INDEX('100-200-300-400', '-', -1);
复制代码 截取效果:
400
3.截取中间的某个值
好比说要取100-200-300-400 的第二个,可以先取count为2的,再从右取count为-1
- SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('100-200-300-400', '-', 2),'-', -1);
复制代码 截取效果:
200
4.如果指定的分隔符找不到则返回整个字符串
- SELECT SUBSTRING_INDEX('100-200-300-400', '-', 5);
复制代码 截取效果:
100-200-300-400
由于在字符串“100-200-300-400”中找不到第5个“-”,以是返回了整个字符串
分割字符串
方法:充分和循环利用函数 SUBSTRING_INDEX(str,delim,count)来实现分割字符串。
一、分割成多列
1.举列
将字符串 ‘John,Doe,25’ 分成三列
- SELECT
- SUBSTRING_INDEX('John,Doe,25', ',', 1) AS first_name,
- SUBSTRING_INDEX(SUBSTRING_INDEX('John,Doe,25', ',', 2), ',', -1) AS last_name,
- SUBSTRING_INDEX('John,Doe,25', ',', -1) AS age;
复制代码 2.运用
表结构:
- CREATE TABLE `remark_test` (
- `remark` varchar(50) DEFAULT NULL COMMENT '备注'
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
复制代码 插入数据:
- INSERT INTO `test`.`remark_test` (`remark`) VALUES ('张三,男,38');
- INSERT INTO `test`.`remark_test` (`remark`) VALUES ('李四,男,32');
- INSERT INTO `test`.`remark_test` (`remark`) VALUES ('林青霞,女,66');
- INSERT INTO `test`.`remark_test` (`remark`) VALUES ('张柏芝,女,45');
- INSERT INTO `test`.`remark_test` (`remark`) VALUES ('刘德华,男,60');
- INSERT INTO `test`.`remark_test` (`remark`) VALUES ('许晴,女,53');
- INSERT INTO `test`.`remark_test` (`remark`) VALUES ('关芝玲,女,58');
- INSERT INTO `test`.`remark_test` (`remark`) VALUES ('成龙,男,62');
复制代码 分割成多列:
- SELECT
- remark AS '原文',
- SUBSTRING_INDEX( remark, ',', 1 ) AS '姓名',
- SUBSTRING_INDEX(SUBSTRING_INDEX( remark, ',', 2 ),',',-1) AS '性别',
- SUBSTRING_INDEX( remark, ',', -1 ) AS '年龄'
- FROM
- remark_test;
复制代码 分割效果:
二、分割成多行
需要借助一张序号从0开始且一连自增的表
- CREATE TABLE `auto_add_seq` (
- `id` int(11) DEFAULT NULL COMMENT '自增序列字段'
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='自增序列表';
复制代码 插入一连自增的序号,序号的最大值根据分割行数确定,这里插入500行:
1.举例
将 字符串’1,2,3,4,5’分割成5行
- SELECT
- substring_index(substring_index('1,2,3,4,5',',',id + 1),',' ,-1) AS new_id
- FROM
- auto_add_seq
- WHERE
- id <= (length('1,2,3,4,5') - length(REPLACE ('1,2,3,4,5', ',', '')));
复制代码 分割效果:
2.运用
表结构:
- CREATE TABLE `test_user` (
- `user_id` int(11) NOT NULL COMMENT '用户id',
- `role_ids` varchar(100) DEFAULT NULL COMMENT '逗号分隔的角色id集合',
- PRIMARY KEY (`user_id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
复制代码 插入数据:
- INSERT INTO `test`.`test_user` (`user_id`, `role_ids`) VALUES (1, '1,3,5,6,8');
- INSERT INTO `test`.`test_user` (`user_id`, `role_ids`) VALUES (2, '1,3,7,6,8,20,15,22');
- INSERT INTO `test`.`test_user` (`user_id`, `role_ids`) VALUES (3, '6,8,20,15,22');
复制代码 将用户id为2的角色id字符串分割多选角色id:
- SELECT substring_index(substring_index(u.role_ids,',',s.id + 1),',' ,-1) AS role_id
- FROM test_user u CROSS JOIN auto_add_seq s ON s.id <= LENGTH(u.role_ids) - LENGTH(REPLACE(u.role_ids,',',''))
- WHERE u.user_id = 2;
复制代码 分割效果:
总结
right(str,length)和left(str,length)只截取指定字符串左或右边指定长度的子串,substring(str,pos,length)截取指定字符串位置开始指定长度的子串,substring_index(str,delim,count) 截取指定字符串在第count个分隔符左边或右边的子串,以上三个函数中 substring_index函数更新机动,充分利用可以产生神奇的效果。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |