Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除并替换sql中字符串中的多个字符(空格、连字符、方括号、句点)_Sql_Sql Server 2005_Tsql - Fatal编程技术网

删除并替换sql中字符串中的多个字符(空格、连字符、方括号、句点)

删除并替换sql中字符串中的多个字符(空格、连字符、方括号、句点),sql,sql-server-2005,tsql,Sql,Sql Server 2005,Tsql,请查看以上给定的电话号码。我需要替换这些数字中的所有空格、连字符、句号、括号和前导0等。我需要这个格式+447469186974 若这个数字有前导的加号,那个么不要替换它,否则我必须用它连接加号 例如 +39235 6595750在这个数字中,我只需要删除空格 +44(0)181 446 5697在这里,我需要删除空格和括号以及括号之间的0,即(0) 07825 893217在本例中,我需要将前导0替换为+号并删除空格 (415)706 2001在此替换“(“with+sign and remo

请查看以上给定的电话号码。我需要替换这些数字中的所有空格、连字符、句号、括号和前导0等。我需要这个格式+447469186974

若这个数字有前导的加号,那个么不要替换它,否则我必须用它连接加号

例如

+39235 6595750在这个数字中,我只需要删除空格

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

07825 893217在本例中,我需要将前导0替换为+号并删除空格

(415)706 2001在此替换“(“with+sign and remove”)”和空格

“请通过电子邮件回复”这是电话号码字段中的条目,我只需要忽略此项

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

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

7798724250只需在数字前加+号即可

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

将仅替换前导“0”,而不会替换“0”的任何其他事件

所需结果为+447769146971

我是否应该为每个要替换的字符使用嵌套的REPLACE、CHARINDES和PATINDES

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

谢谢。

试试看:

+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
输出:

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
编辑


根据OP的最新编辑:
我不必在db中更新这些数字。我只想在查询中使用这些数字来匹配这些数字…
为什么每次运行查询时都要格式化这些数字??将格式化后的数字存储在数据库中,然后加入它们。即使您只是创建一个持久化的计算列或一个在这个格式化数字上建立索引的视图,您也会有更好的性能。

一个解决方案是创建一个函数

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)
然后像这样编写Update语句:

 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

我希望那些不是真实的人的数字…你是绝对正确的。不要试着拨这些号码。也许你想把它们删掉,并提供随机的例子?你知道,就像+440123456789一样,绝对正确,当你可以按需要的方式存储数据时,千万不要每次查询时都进行这种重新格式化。至少在出现另一个无效字符之前,这是有效的,此时你必须添加另一个替换,另一个,再另一个。。。即使如此,编辑中的评论也可以加1。如果您仍然需要原始版本,可以同时存储这两个版本。非常感谢大家。我真的很感谢你的评论。我将按照@thiloth的建议将这些数字保存在单独的列中,这将解决“完整”问题。循环可能不会很快,但根据其他注释,您只需要对每个数字执行一次。
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]%'