You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 11:03:24