要清理的电话号码模式

时间:2016-06-23 20:18:31

标签: sql postgresql

我有电话号码字段来清理并试图找到这种格式的垃圾号码 数字模式:如000000,111111,222222,3333333,4444444,....

Phone
----------------
(444)333-7777
555.666.6666
333.555-7777
222-222-2222
1111111111
5104554535
(555)(353)(5343)

电话(输出我想看的是)

222-222-2222
1111111111

和第二个问题我想知道记录的数量有特殊字符。从上面的电话字段我想得到5作为计数。

感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

这可以找到十位数的重复数字

    WITH cleaned_numbers AS (
      select regexp_replace(number, '[^0-9]', '', 'g') AS number
      from phone_numbers
    )
    select number
    from cleaned_numbers
    where number::text ~ '([0-9])(\1)(\1)(\1)(\1)(\1)(\1)(\1)(\1)(\1)'

答案 1 :(得分:0)

根据@ Shayna的出色回应,您可以使用正则表达式寻找重复数字来查找问题的第一部分。更改大括号之间的数字以检查不同数量的重复数字:

with
  t1(phone) as (values ('000-000-000'::text), ('(000)000-0000'), ('000-000-0000'), ('0000000001'),('0000000000'),('765-456-6656')),
  cleaned_numbers AS ( select phone, regexp_replace(Phone, '[^0-9]', '', 'g') AS numeric_phone from t1 ) 
select * 
from cleaned_numbers 
where numeric_phone ~ '([0-9])\1{8}'
order by phone

问题的第二部分,再次使用正则表达式识别除数字或空格以外的其他电话(删除括号之间的空格以查找包含空格的电话号码,或添加您认为有效的任何符号,像括号和短划线一样):

with
  t1(phone) as (values ('000-000-000'::text), ('(000)000-0000'), ('000-000-0000'), ('0000000001'),('0000000000'),('765-456-6656'))
select count(*)
from t1
where phone ~ '[^0-9 ]'

答案 2 :(得分:0)

不幸的是,我没有找到真正清理的解决方案,并且修复了来自不同供应商的带有奇数字符的电话号码。在VBA中有解决方案并将其修改为SQL格式。下面是如何创建如何使用的功能和样本。

使用功能更新电话号码后,只需删除所有''电话号码,你是黄金。如果您不想删除该字段,则可以忽略最后的if语句和Set。最好不要在PK字段上运行可能创建重复项。

我使用功能清理电话号码,这将修复所有电话号码问题或清除字段。如果为空,则返回Null(防止错误)

Print'/*Fix Phone Numbers Call*/'
Update tblTemp
    Set Phone = dbo.fnPhoneFix(tblTemp.Phone)
From tblTemp

要创建功能,请使用以下代码:

CREATE FUNCTION [dbo].[fnPhoneFix](@PhoneOld VarChar(20))
    Returns VarChar(10)
AS
    Begin
    Declare @iCnt Int = 0
    Declare @PhoneNew VarChar(15)  = ''

    IF @PhoneOld IS NULL
        RETURN NULL;

    While @iCnt <= LEN(@PhoneOld)
        Begin
            IF Substring(@PhoneOld,@iCnt,1) >= '0' AND Substring(@PhoneOld,@iCnt,1) <= '9'
            Begin
                SET @PhoneNew = @PhoneNew + Substring(@PhoneOld,@iCnt,1)
            End
            Set @iCnt = @iCnt + 1
        End

    If LEN(@PhoneNew) > 10 and Left(@PhoneNew, 1) = '1'
        Set @PhoneNew = RIGHT(@PhoneNew,10);
    Else
        Set @PhoneNew = Left(@PhoneNew,10);

    If @PhoneNew = '0000000000' or @PhoneNew = '1111111111' 
            or @PhoneNew = '2222222222' or @PhoneNew = '3333333333'
            or @PhoneNew = '4444444444' or @PhoneNew = '5555555555' 
            or @PhoneNew = '6666666666' or @PhoneNew = '7777777777' 
            or @PhoneNew = '8888888888' or @PhoneNew = '9999999999'
            or LEN(@PhoneNew) <> 10
        Set @PhoneNew ='';
    Return @PhoneNew
End

答案 3 :(得分:-1)

您可以使用LIKE子句

指定垃圾电话号码

即。

WHERE phone like ('%.%')

^这将检索包含“。”的所有垃圾电话号码。包含任何字符%之前或之后的任何字符%