如何利用SUBSTR函数处理含位置的手机号,实现查询与位置还原
使用SUBSTR函数拆分电话号码与归属地的解决方案
核心思路
利用SUBSTR结合位置查找函数(如MySQL的LOCATE、Oracle的INSTR),精准拆分出电话号码和归属地两部分:
- 电话号码:截取竖线
|之前的所有字符 - 归属地:截取竖线
|之后的所有字符
分数据库实现示例
1. MySQL环境
假设存储数据的字段名为phone_info,表名为user_contacts,可以用以下SQL同时提取两个部分:
SELECT -- 提取电话号码:存在|则取到其前一位,否则取全字段 SUBSTR(phone_info, 1, IF(LOCATE('|', phone_info) > 0, LOCATE('|', phone_info) - 1, LENGTH(phone_info))) AS phone_number, -- 提取归属地:存在|则取其后的内容,否则返回空 SUBSTR(phone_info, IF(LOCATE('|', phone_info) > 0, LOCATE('|', phone_info) + 1, LENGTH(phone_info) + 1)) AS location FROM user_contacts;
- 你可以先导出
phone_number列去查询活跃号码 - 保留这条查询的完整结果(关联
phone_number和location),后续统计时直接通过号码匹配归属地即可
2. Oracle环境
Oracle中用INSTR替代LOCATE,写法如下:
SELECT CASE WHEN INSTR(phone_info, '|') > 0 THEN SUBSTR(phone_info, 1, INSTR(phone_info, '|') - 1) ELSE phone_info END AS phone_number, CASE WHEN INSTR(phone_info, '|') > 0 THEN SUBSTR(phone_info, INSTR(phone_info, '|') + 1) ELSE NULL END AS location FROM user_contacts;
注意事项
- 如果部分数据没有竖线
|(只有纯号码),上述SQL会自动处理:号码取全字段,归属地为空 - 若字段中存在多个竖线,
LOCATE/INSTR只会匹配第一个竖线,符合你的需求(因为号码在第一个竖线前)
内容的提问来源于stack exchange,提问作者irakoze Christa
相关产品推荐
相关产品推荐

