語法
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博客