Oracle SQL提取多列合规手机号、非合规值置空方法咨询
Oracle 多手机号字段按规则置空实现方案
原有写法问题说明
你之前的SQL存在三个核心问题:
- 把字段校验逻辑写在
WHERE子句中,本质是做行级过滤,只有满足WHERE条件的记录才会返回,和你「导出全量数据、仅替换不符合规则的字段值」的需求完全不符 - 多个条件用
AND连接,要求三个字段同时匹配07开头的规则才会保留行,进一步导致返回结果集大幅缩水 - 带空格的字段名未使用双引号包裹,在Oracle中实际执行会直接报标识符无效错误
正确实现逻辑
你需要的是字段级的条件判断:逐行检查三个电话号码字段的取值,单个字段值满足「以07开头、纯数字、总长度11位」规则就保留原值,不满足就置空,不做任何行过滤。
用CASE WHEN搭配Oracle正则匹配函数REGEXP_LIKE即可实现,不需要额外用replace类函数做值替换,逻辑更简单、执行效率更高。
可直接执行的SQL代码
SELECT CASE WHEN REGEXP_LIKE(TRIM("home phone"), '^07[0-9]{9}$') THEN TRIM("home phone") ELSE NULL END AS "home phone", CASE WHEN REGEXP_LIKE(TRIM("Work phone"), '^07[0-9]{9}$') THEN TRIM("Work phone") ELSE NULL END AS "Work phone", CASE WHEN REGEXP_LIKE(TRIM("Mobile no"), '^07[0-9]{9}$') THEN TRIM("Mobile no") ELSE NULL END AS "Mobile no" FROM DB;
逻辑说明
- 正则规则
^07[0-9]{9}$严格匹配目标手机号:^标记字符串起始位置,强制前两位必须是07[0-9]{9}匹配后续连续9位纯数字,加上开头2位总长度固定为11位$标记字符串结束位置,避免号码后带多余空格、特殊符号的内容被误判为合法值
- 嵌套
TRIM()函数是为了自动清除字段值首尾的不可见空格,避免因为数据录入时多打了空格导致合法号码被误置空 - 该SQL会返回表中全量记录,仅对不符合规则的单个字段值置空,完全匹配你的导出需求
如果后续业务调整需要提取字段中夹杂的合法手机号(比如字段值存了"手机号07123456789备注"这类带文本的内容),可以把判断逻辑换成
REGEXP_SUBSTR提取符合规则的子串;按你当前描述的规则,只要字段包含非数字内容就置空,上述写法已经完全满足。
内容的提问来源于stack exchange,提问作者DLR
相关产品推荐
相关产品推荐

