postgresql 清除包含特殊字符和字母的电话号码

o0lyfsai  于 2022-12-29  发布在  PostgreSQL
关注(0)|答案(2)|浏览(246)

我有垃圾的电话号码字段,我想清理他们。我想知道如何查询检查是否有任何特殊字符,字母在电话号码字段。有人能帮助吗?我尝试了这个查询,没有工作。我需要在PostgreSQL的代码

select phone from table where phone like '[^[:alpha:]]' and phone <>''
-- and phone not like '[^0-9]'
order by phone

表中的输入值如下所示:

Phone
-----
(443)-554-6677
111-111-1111
345-rty-34fr
4345434444 ext

输出(应如下所示有效电话号码)

(443)-554-6677
111-111-1111

感谢你的帮助。
谢谢你,史瓦提。

plicqrtu

plicqrtu1#

我们可以使用POSIX正则表达式来获得所需的输出:

select phone from t1 where phone<>'' and phone!~'[[:alpha:]]';

您似乎试图将正则表达式语法与like操作符一起使用,但这是不正确的。它基本上只提供%前缀/后缀通配符和_单字符通配符。
如果你想更加严格,我们可以这样做:

select phone from t1 where phone~'^(\([0-9]{3}\)|[0-9]{3})-[0-9]{3}-[0-9]{4}$';

测试夹具

drop table if exists t1;
create table t1 (phone text);
insert into t1 (phone) values ('(443)-554-6677'), ('111-111-1111'), ('345-rty-34fr'), ('4345434444 ext');
xyhw6mcr

xyhw6mcr2#

我用这个脚本把美国电话号码格式化成国际格式。它工作得很好。这个脚本看这个号码是不是故意格式化的,如果是,删除所有无用的字符,我发现,如果一个数字曾经存储与+#########格式,那么它是一个很好的数字99%的时间。如果它存储与(###)###-####格式化后,99%的情况下它是美国、加拿大、英国的数字。而这99%的统计数据都是当场编造的。
这个脚本的缺点是它不切出扩展名,你可以通过检查pclean输出是否以+1开头并且长度大于12个字符来切出扩展名,如果是,那么slice(12,-1)或者类似的语句。

function formatPhoneNumber(phone) {
    input = phone
    if (input==null){input = "3456"}
    pclean = input.replace(/[^0-9\+]/g, "") //works
    clean = pclean.replace(/^0*/g, "")
    clean = clean.replace(/^1*/g, "")
    if (pclean.charAt(0) != "+" ) {pclean = "+1" + clean    }

    if(pclean.length < 12){pclean = null}
    return pclean 
}

相关问题