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

PostgreSQL中如何通过正则匹配指定字符串提取电话号码行?

提取匹配电话号码的PostgreSQL查询方案

嘿,这个场景太常见了——存储的电话号码总是带着各种乱七八糟的分隔符(+、-、空格),但我们搜索时又想用干净的纯数字串。下面给你两种实用的实现方案,从快速查询到性能优化都覆盖到了:

方案一:直接用正则标准化后匹配

这是最直接的写法,用regexp_replace把phone_number里所有非数字字符清掉,再和你的搜索串'123456789'做等值匹配:

SELECT *
FROM people
WHERE regexp_replace(phone_number, '[^0-9]', '', 'g') = '123456789';

关键细节解释:

  • [^0-9]是正则里的“反向匹配”,意思是匹配所有不是0-9的字符;
  • 第三个参数''表示把匹配到的字符替换成空(也就是删掉);
  • 最后一个参数'g'是全局替换标志——如果不加它,只会删掉第一个非数字字符,加了之后才会把所有非数字都清掉。

你可以先单独跑个测试看看标准化后的结果对不对:

SELECT 
  id, 
  name, 
  phone_number, 
  regexp_replace(phone_number, '[^0-9]', '', 'g') AS standardized_phone
FROM people;

方案二:预存标准化字段(优化高频查询性能)

如果这个查询是你经常要用的,或者表的数据量很大,每次都跑regexp_replace会有点性能损耗。这时候可以给表加一个生成列,提前把标准化后的电话号码存起来,还能加索引加速查询:

第一步:添加生成列

ALTER TABLE people
ADD COLUMN standardized_phone TEXT GENERATED ALWAYS AS (regexp_replace(phone_number, '[^0-9]', '', 'g')) STORED;

这个列会自动跟着phone_number的变化更新,不用你手动维护。

第二步:给生成列加索引

CREATE INDEX idx_people_standardized_phone ON people(standardized_phone);

之后查询就快多了:

SELECT *
FROM people
WHERE standardized_phone = '123456789';

额外小提示

如果你的搜索场景需要保留国际区号的+号(比如搜索+6512345678),只要把正则里的匹配模式改成[^0-9+]就行,这样就能保留+号不被删掉啦。

内容的提问来源于stack exchange,提问作者user1320651

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:47:54