PostgreSQL验证电话号码格式的SQL实现求助
解决方案
你的现有SQL存在几个问题:
- 未锚定正则的开头和结尾,可能导致部分匹配的错误判断
- 误用了
LIKE的通配符%而非正则语法匹配分机号 - 未处理电话号码末尾的空白字符(如ID 1234560的末尾空格)
修正后的SQL如下:
with t (id,telephone) as (values (1234560,'(345) 908-1234 '), (1234561,'(345) 908-1234;ext=1234'), (1234562 ,'(345) 908-1234;ext=12345'), (1234563 ,'(345) 908-12345;ext=12345'), (1234564 ,'1234567;ext=12345'), (1234565 ,'123ABC;ext=12345'), (1234566 ,'Ext=12345'), (1234567 ,'+1123456789') ) select ID, TELEPHONE, case when TELEPHONE similar to '^\(\d{3}\) \d{3}-\d{4}\s*$' then 0 when TELEPHONE similar to '^\(\d{3}\) \d{3}-\d{4};ext=\d+\s*$' then 0 else 1 end as TEL_IND from t;
关键修正说明:
- 用
^和$锚定正则的开头与结尾,确保整个字符串完全符合格式要求 - 用
\d+匹配分机号的任意位数数字(替代错误的%) - 添加
\s*允许电话号码末尾存在任意数量的空白字符,兼容ID 1234560的情况 - 严格匹配小写的
ext,符合你指定的有效格式规则
执行后会正确标记ID 1234560、1234561、1234562为有效(TEL_IND=0),其余为无效(TEL_IND=1)。
内容的提问来源于stack exchange,提问作者datatester
相关产品推荐
相关产品推荐

