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

Kas*_*hif 6 sql t-sql sql-server-2005

+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
Run Code Online (Sandbox Code Playgroud)

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

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

例如

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

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

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

(415)706 2001在此替换'('带+符号并删除')'和空格.

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

+48.40.23755432删除电话号码的句点

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

7798724250只需要在数字前添加+号

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

只有前导'0'才会被替换为'0'的任何其他内容

期望的结果是+447769146971

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

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

谢谢.

KM.*_*KM. 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
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

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)
Run Code Online (Sandbox Code Playgroud)

编辑

基于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计算列或一个带有这个格式化数字索引的视图,你也会有更好的表现.