MySQL数据库实战——分割同一列中的中文与数字(使用REGEXP 正则判断)

应用场景如下:

要求:今天在项目中遇到一个问题,是统计某校教师与学生的各自总人数并且要分别取出学号与职工号。其中教师的职工号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]'; 右边第七位不是数字

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青山孤客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值