在很多时候数据库的表中的某一字段会存有多个信息,有的是按照指定的分隔符隔开,有的是按照不同的位置进行划分,那么有的时候就不得不将该字段的每条记录做选择性截取或是分割成多个字段,这一步骤可以在业务逻辑层中完成,也使用SQL存储过程里完成,这里我要说的就是存储过程中的字符串截取
先准备如下的数据表以备实验:
1.左右截取
1.1 left(str, length) 截取字符串从左起的n位,比如要获取表中每个人的出生年份
SELECT name,LEFT(birthday,4) as '出生年' FROM student
1.2 right(str, length) 截取字符串从左起的length位,比如要获取表中每个人的出生日期
SELECT name,RIGHT(birthday,4) as '出生日期' FROM student
ps:值得一提的是,在对于汉字组成的字符串,截取的位数也是汉字的个数,具体意思如下:
2.选位置截取
2.1 substring(str, pos)表示将字符串从第pos位开始截取,一直截取的到字符串尾,pos为正表示正数第|pos|位,pos为负表示倒数第|pos|位,比如我们要得到表中每人的英文名方法如下
SELECT name,SUBSTRING(name,5) AS 'English Name' FROM student
2.2 substring(str, pos, len)表示将字符串从pos位开始截取len位,pos为正表示正数第|pos|位,pos为负表示倒数第|pos|位,而len只能为正不能为负,比如我们要截取表中每人的中文名的名部分可以这样实现
SELECT name,SUBSTRING(name,2,2) AS '中文名' FROM student
当pos为负,通常应用的场景是要截取某条数据的后缀或者后几位,比如截取电话号码的后四位就可用pos为负的方法,这里就不展示了
3.按某一符号截取
substring_index(str,delim,count)表示将字符串按某一特定符号delim进行截取,count为正表示截取整数正数第|count|个delim字符之前的所有字符,count为负表示截取整数倒数第|count|个delim字符之后的所有字符,我先已将表中没人的中文姓名和英文姓名用 / 分割开,要分别获取中文姓名和英文姓名就可以做如下操作
SELECT name,SUBSTRING_INDEX(name,'/',1) AS '中文姓名',SUBSTRING_INDEX(name,'/',-1) AS '英文姓名' FROM student