如何在SQL中清理手机号列冗余内容,仅保留纯手机号
提取SQL列中的纯手机号方案
根据你的需求,需要从包含冗余前缀/后缀的字符串中提取纯手机号(连续数字),以下是不同主流数据库的实现方式:
MySQL/MariaDB
方案1:提取所有连续数字
SELECT REGEXP_SUBSTR(PHONE_NUMBER, '[0-9]+') AS CLEAN_PHONE_NUMBER FROM your_table;
方案2:精准匹配+后的数字组(更可靠)
SELECT REGEXP_SUBSTR(PHONE_NUMBER, '\\+([0-9]+)', 1, 1, 'e') AS CLEAN_PHONE_NUMBER FROM your_table;
'e'参数指定返回正则表达式中捕获组的内容,直接提取加号后的纯数字。
SQL Server
适用于所有版本:结合PATINDEX和SUBSTRING
SELECT SUBSTRING(PHONE_NUMBER, PATINDEX('%[0-9]%', PHONE_NUMBER), LEN(PHONE_NUMBER) - PATINDEX('%[0-9]%', REVERSE(PHONE_NUMBER)) - PATINDEX('%[0-9]%', PHONE_NUMBER) + 2) AS CLEAN_PHONE_NUMBER FROM your_table;
SQL Server 2019+:用正则替换去掉非数字字符
SELECT REGEXP_REPLACE(PHONE_NUMBER, '[^0-9]', '') AS CLEAN_PHONE_NUMBER FROM your_table;
Oracle
提取所有连续数字
SELECT REGEXP_SUBSTR(PHONE_NUMBER, '[0-9]+') AS CLEAN_PHONE_NUMBER FROM your_table;
精准提取+后的数字组
SELECT REGEXP_SUBSTR(PHONE_NUMBER, '\+(\d+)', 1, 1, NULL, 1) AS CLEAN_PHONE_NUMBER FROM your_table;
最后一个参数1表示返回第一个捕获组的内容。
PostgreSQL
精准匹配+后的数字组
SELECT (REGEXP_MATCH(PHONE_NUMBER, '\+(\d+)'))[1] AS CLEAN_PHONE_NUMBER FROM your_table;
去掉所有非数字字符
SELECT REGEXP_REPLACE(PHONE_NUMBER, '[^0-9]', '', 'g') AS CLEAN_PHONE_NUMBER FROM your_table;
补充说明
如果你的数据中,手机号始终是字符串里唯一的连续数字段,直接提取所有数字即可;如果存在其他数字冗余,优先使用精准匹配+后数字组的方案,避免误提取。
内容的提问来源于stack exchange,提问作者dingaro
相关产品推荐
相关产品推荐

