应用场景如下:
要求:今天在项目中遇到一个问题,是统计某校教师与学生的各自总人数并且要分别取出学号与职工号。其中教师的职工号6位,学生的学号为7位,但是并没有将学号与姓名分开,如上图全部存在humanName这一列中。
这里需要分割字符串,前面中文后面是数字,并且数字的长度不同,分别为6位于7位。需要按照6位7位分别切割。
解决思路:
这里我们要清楚这样的数据的分界线在哪,首先我看到前面姓名有两个中文字符与三个中文字符还有四个中文字符的还有数据是“???”的,前面作为突破口有点难度,可能学艺不精没有想到好的解决方案。后面我就换个思路从后面往前找,后面一定都是他们的学号与职工号,只是不同类型的长度不同而已。这个就挺好判断的了,我就从右边取第七个字符判断它是不是数字就可以了。如果是数字说明是学生,如果不是这就是教职工。 {right(humanname,7) REGEXP '^[0-9]'}
实现:
7位为学生学号,查询学生的总数:
select count(*) from (select right(humanname,7) from snap_match where right(humanname,7) REGEXP '^[0-9]' and alarmTime > '2019-10-15 00:00:00' and alarmTime < '2019-10-16 00:00:00') xh;
修改一下,使代码更简洁:
SELECT count( * ) FROM snap_match WHERE RIGHT ( humanname, 7 ) REGEXP '^[0-9]' AND alarmTime > '2019-10-15' AND alarmTime < '2019-10-16';
获取学生的七位学号:
select right(humanname,7) from snap_match where right(humanname,7) REGEXP '^[0-9]';
可以得出所有学生的学号:
6位为教职工工号,查询教职工的总数:
SELECT count( * ) FROM snap_match WHERE RIGHT ( humanname, 7 ) REGEXP '^[^0-9]' AND alarmTime > '2019-10-15' AND alarmTime < '2019-10-16';
可以获得所有教职工的职工号:
select right(humanname,6) from snap_match where right(humanname,7) REGEXP '^[^0-9]';
OK问题解决,总结一下。这里我们使用了REGEXP 判断是否为数字。
right(humanname,7) REGEXP '^[0-9]'; 右边第七位是数字
right(humanname,7) REGEXP '^[^0-9]'; 右边第七位不是数字