从sql中的字符串中删除和替换多个字符(空格,连字符,括号,句点)

时间:2010-03-19 13:11:05

标签: sql sql-server-2005 tsql

+39 235 6595750
19874624611
+44 (0)181 446 5697
+431 6078115-2730
+1 617 358 5128 
+48.40.23755432
+44 1691 872 410
07825 893217
0138 988 1649
(415) 706 2001
00 44 (0) 20 7660 4650
(765) 959-1504
07731 508 486
please reply by email
dont have one
+447769146971

请参阅上面给出的电话号码。我需要从这些数字中替换所有空格,连字符,句点,括号和前导0等。我需要这种格式+447469186974

如果数字有前导加号,那么不要替换它,否则我必须连接+符号。

E.G

+39 235 6595750 在这个数字中我只需要删除空格。

+44(0)181 446 5697 在此我需要删除空格和括号以及括号之间的0,即(0)

07825 893217 在此我需要用+号替换前导0并删除空格

(415)706 2001 在此替换'('with + sign并删除')'和空格。

'请通过电子邮件回复'这是电话号码字段中的条目,我只需要忽略它。

+48.40.23755432 删除电话号码中的句号

(765)959-1504 删除括号和空格以及连字符,并在数字前添加+号。

7798724250 只需在号码前添加+号

00 44(0)20 7660-4650 需要删除前导0 IE'00'删除空格和括号,并在括号和连字符之间删除0并在数字前面添加+号

只会替换前导'0'而不会替换任何其他'0'

所需的结果是 +447769146971

我应该为每个要替换的字符使用嵌套的REPLACE,CHARINDES,PATINDES吗?

编辑:我不必在db中更新这些数字。我只是想在我的查询中使用这些数字来匹配这些数字与呼叫日志数据库中的数字。在呼叫日志中,db格式总是像这样+447769146971

感谢。

2 个答案:

答案 0 :(得分:6)

尝试一下:

SET NOCOUNT ON
DECLARE @Phone table (PhoneNo varchar(50))
INSERT INTO @Phone VALUES ('+39 235 6595750')
INSERT INTO @Phone VALUES ('19874624611')
INSERT INTO @Phone VALUES ('+44 (0)181 446 5697')
INSERT INTO @Phone VALUES ('+431 6078115-2730')
INSERT INTO @Phone VALUES ('+1 617 358 5128 ')
INSERT INTO @Phone VALUES ('+48.40.23755432')
INSERT INTO @Phone VALUES ('+44 1691 872 410')
INSERT INTO @Phone VALUES ('07825 893217')
INSERT INTO @Phone VALUES ('0138 988 1649')
INSERT INTO @Phone VALUES ('(415) 706 2001')
INSERT INTO @Phone VALUES ('00 44 (0) 20 7660 4650')
INSERT INTO @Phone VALUES ('(765) 959-1504')
INSERT INTO @Phone VALUES ('07731 508 486')
INSERT INTO @Phone VALUES ('please reply by email')
INSERT INTO @Phone VALUES ('dont have one')
INSERT INTO @Phone VALUES ('+447769146971')
SET NOCOUNT OFF

;WITH StripNumber AS
(
SELECT
    PhoneNo,
    REPLACE(
    REPLACE(
    REPLACE(
    REPLACE(
    REPLACE(
    REPLACE(PhoneNo
           ,'(','')
           ,')','')
           ,'.','')
           ,' ','')
           ,'-','')
           ,'+','') AS StripNumber
    FROM @Phone
)
SELECT
    CASE
        WHEN ISNUMERIC(StripNumber)=1 THEN '+'+CONVERT(varchar(50),CONVERT(bigint,StripNumber))
        ELSE PhoneNo  --make this ELSE NULL if you don't want to see invalid non numeric phone numbers
    END AS PhoneNumber
    FROM StripNumber

输出:

PhoneNumber
---------------------------------------------------
+392356595750
+19874624611
+4401814465697
+43160781152730
+16173585128
+484023755432
+441691872410
+7825893217
+1389881649
+4157062001
+4402076604650
+7659591504
+7731508486
please reply by email
dont have one
+447769146971

(16 row(s) affected)

修改

基于OP的最新编辑:I don't have to update these numbers in db. I just want to use these numbers in my query to match these numbers...为什么你想在每次运行查询时格式化数字?将格式化的数字存储在数据库中,然后加入它们。即使你只是制作了一个PERSISTED计算列或一个带有这个格式化数字索引的视图,你也会有更好的表现。

答案 1 :(得分:2)

一种解决方案是创建一个功能

 Create Function ExtractDigits( @inVal varChar(50), @EliminateLeadingZeroes TinyInt)
 Returns VarChar(50)
 As
 Begin
     Declare @outVal VarChar(50)
     Set @outVal = ''
     Declare @C Char(1)
     While Len(@Inval) > 0 Begin
         Set @C = Left(@InVal, 1)
         Set @InVal = SubString(@InVal, 2, Len(@InVal) -1)
         If @C Between '0' And '9'
             Set @outVal = @outVal + @C
     End
     If @EliminateLeadingZeroes = 1
        While Left(@outVal,1) = '0'
             Set @OutVal = Substring(@OutVal,2,Len(OitVal) -1)
     Return @OutVal
End

然后像这样编写Update Statement:

While Exists (Select * From table 
              Where Phone Not Like'+[0-9]%'
Update table Set 
    Phone = '+' + dbo.ExtractDigits(Phone, 1)
Where Phone Not Like'+[0-9]%'