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

标签 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

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

例如

+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 I.E '00' 删除空格和括号以及括号和连字符之间的 0 并在数字前面添加 + 号

只有前导的 '0' 将被替换,而不是任何其他出现的 '0'

想要的结果是 +447769146971

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

编辑:我不必在 db 中更新这些数字。我只想在我的查询中使用这些数字来将这些数字与通话记录数据库中的数字相匹配。在通话记录数据库格式总是这样+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

输出:
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 计算列或一个以该格式化数字为索引的 View ,您也会获得更好的性能。

关于sql - 从 sql 中的字符串中删除和替换多个字符(空格、连字符、括号、句点),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2477506/

相关文章:

sql-server - Sql Server 2005+ 中的 Oracle Decode 函数等效

mysql - 从特定列表中选择随机数

sql - 使用逗号分隔符拆分列

sql-server - 将 'current' 行传递给 SQL Server 中的函数

sql - MS Access 错误 "ODBC--call failed. Invalid character value for cast specification (#0)"

sql-server - SQL Server 消除函数调用并替换为连接

mysql - 有人会如何为 SQL 创建 ID?

sql - "%%DatabaseEx"在 SQL 中起什么作用?

java - 包含撇号 php 的文本

MySQL 表 UNION 问题