Oracle如何移除phone_number列开头的0、93、0093指定前缀字符
Oracle 移除phone_number列指定前缀的实现方案
核心注意事项
要移除的前缀包含0、93、0093三种,其中0093长度最长,处理时必须优先匹配最长前缀,否则会出现截断错误:比如0093开头的号码如果先匹配到前缀0,只会截掉首位0,剩下093开头的错误结果。
实现方法
方法1:正则替换(写法简洁,适合绝大多数场景)
用REGEXP_REPLACE函数,正则规则中把最长的前缀放在多选分支最前面,匹配字符串开头的目标前缀后替换为空即可。
- 查询验证处理结果的语句:
SELECT phone_number AS 原始号码, REGEXP_REPLACE(phone_number, '^(0093|93|0)', '') AS 处理后号码 FROM 你的表名;
- 确认结果无误后,可直接执行更新语句批量修改数据:
UPDATE 你的表名 SET phone_number = REGEXP_REPLACE(phone_number, '^(0093|93|0)', ''); -- 建议执行后先核对结果,再执行COMMIT提交事务
方法2:CASE WHEN逐段判断(性能更高,适合超大数据量场景)
如果表数据量达到千万级以上,正则替换可能存在性能开销,可以用CASE WHEN按优先级判断前缀,再用SUBSTR截取对应长度的字符串,逻辑完全可控,执行效率更高:
SELECT phone_number AS 原始号码, CASE WHEN phone_number LIKE '0093%' THEN SUBSTR(phone_number, 5) -- 0093占4位,从第5位开始截取 WHEN phone_number LIKE '93%' THEN SUBSTR(phone_number, 3) -- 93占2位,从第3位开始截取 WHEN phone_number LIKE '0%' THEN SUBSTR(phone_number, 2) -- 0占1位,从第2位开始截取 ELSE phone_number -- 没有匹配到任何前缀则保留原值 END AS 处理后号码 FROM 你的表名;
样例数据验证结果
用题目给出的样例数据测试,两种方法都能得到预期结果:
- 原始值
078912354→ 处理后78912354 - 原始值
93784385483→ 处理后784385483 - 原始值
009378248448→ 处理后78248448 - 原始值
776868886→ 处理后776868886
注意:生产环境执行UPDATE操作前,建议先备份对应列数据,通过SELECT语句核对处理结果完全符合预期后再提交修改,避免误改数据。
内容的提问来源于stack exchange,提问作者Arifullah
相关产品推荐
相关产品推荐

