语法
substring_index(string,delimiter,number)
string : 要分隔的字符串。
delimiter : 分隔符
number :分隔符位置
注意
- number 可以为正数,也可以为负数。
正数时是指的是从左向右数,第 number 个分隔符左边的所有内容。
负数时,指的是从右往左数,第 number 个分隔符右边的所有内容。
- 当 number 的绝对值 大于 delimiter 的个数时,会将 string 全部输出
- 个人理解(欢迎指正)
栗子
修复串列了的记录_牛客题霸_牛客网 (nowcoder.com)
描述
现有试卷信息表examination_info(exam_id试卷ID, tag试卷类别, difficulty试卷难度, duration考试时长, release_time发布时间):
id | exam_id | tag | difficulty | duration | release_time |
1 | 9001 | 算法 | hard | 60 | 2021-01-01 10:00:00 |
2 | 9002 | 算法 | hard | 80 | 2021-01-01 10:00:00 |
3 | 9003 | SQL | medium | 70 | 2021-01-01 10:00:00 |
4 | 9004 | 算法,medium,80 | 0 | 2021-01-01 10:00:00 |
录题同学有一次手误将部分记录的试题类别tag、难度、时长同时录入到了tag字段,请帮忙找出这些录错了的记录,并拆分后按正确的列类型输出。
由示例数据结果输出如下:
exam_id | tag | difficulty | duration |
9004 | 算法 | medium | 80 |
建表语句:
drop table if exists examination_info,exam_record;
CREATE TABLE examination_info (id int PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',exam_id int UNIQUE NOT NULL COMMENT '试卷ID',tag varchar(32) COMMENT '类别标签',difficulty varchar(8) COMMENT '难度',duration int NOT NULL COMMENT '时长',release_time datetime COMMENT '发布时间'
)CHARACTER SET utf8 COLLATE utf8_general_ci;INSERT INTO examination_info(exam_id,tag,difficulty,duration,release_time) VALUES(9001, '算法', 'hard', 60, '2020-01-01 10:00:00'),(9002, '算法', 'hard', 80, '2020-01-01 10:00:00'),(9003, 'SQL', 'medium', 70, '2020-01-01 10:00:00'),(9004, '算法,medium,80','', 0, '2020-01-01 10:00:00');
题解:
select exam_id,substring_index(tag,',',1) as tag,substring_index(substring_index(tag,',',2),',',-1)as difficuty,cast(substring_index(tag,',',-1) as DECIMAL) as duration
from examination_info
where tag like '%,%' ;select exam_id,substring_index(tag,',',2) as difficutyfrom examination_info
where tag like '%,%' ;
关于 cast() 的使用 Mysql 数据类型的转换之 cast()-CSDN博客