使用正则表达式查找相同的数字电话号码

时间:2014-07-09 11:34:25

标签: sql sql-server regex sql-server-2008

我需要从表中找到相同的数字电话号码并删除它们。电话号码如下:

+999999999999
11111111
0000000000000
44444444

我正在关注this answer来解决这个问题。我在尝试:

select * from tblPhone where PhoneNo like  '^([0-9a-z])\1+$'

但没有成功。 PhoneNo是varchar。我怎么能做到这一点?

6 个答案:

答案 0 :(得分:2)

试试这个:

select *
from tblPhone
where 
substring(replace(PhoneNo,'+',''),1,len(replace(PhoneNo,'+',''))-1) 
= substring(replace(PhoneNo,'+',''),2,len(replace(PhoneNo,'+','')))

这个想法是,如果从第1个到倒数第二个位置的子字符串匹配从第2个到最后一个的子字符串,则该字符串必须由相同的字符组成。

Demo

答案 1 :(得分:1)

这是一个想法。第一个字符有问题,可以是+或数字。让我们用第二个字符替换空字符串并查看结果:

where replace(PhoneNo, substring(PhoneNo, 2, 1), '') in ('+', '') and
      (PhoneNo not like '%[^0-9]%' and PhoneNo like '[0-9]%'or
       PhoneNo not like '+%[^0-9]%') and PhoneNo like '+%'
      )

答案 2 :(得分:0)

您可以使用patindex在SQL Server中进行模式匹配,但不直接支持正则表达式。但是,如果你使用.Net和CLR user-defined functions,那就有希望了。

答案 3 :(得分:0)

create table #temp(col1 varchar(25))

插入#temp值('+9999999')

插入#temp值('+ 123456789')

插入#temp值('+444444444')

插入#temp值('+ 9840536987')

从#temp

中选择*

开始tran 从#temp

中选择*

从#temp删除 其中cast(替换(替换(col1,'+',''),右(替换(col1,'+',''),1),0)为bigint)= 0

从#temp中选择* rollback tran enter image description here

答案 4 :(得分:0)

你可以试试这个:

SELECT *
  FROM tblPhone
WHERE 
  CAST(PhoneNo AS BIGINT) = REPLICATE(RIGHT(PhoneNo, 1), LEN(CAST(PhoneNo AS BIGINT)))

OR

SELECT *
FROM   tblPhone
WHERE  REPLACE(PhoneNo, RIGHT(PhoneNo, 1),'') IN ('+','')

答案 5 :(得分:0)

这会生成所有可能的无效电话号码(这是一个非常小的号码),并将其连接到tblPhone。这比对表格中的每个电话号码进行字符串操作更有效。

DELETE t1
FROM tblPhone t1
INNER JOIN (VALUES (''),('+')) t2(prefix)
  CROSS JOIN (VALUES('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9')) t3(digit)
  CROSS JOIN (SELECT TOP (13) ROW_NUMBER() OVER(ORDER BY (SELECT 1)) FROM master.dbo.spt_values) t4(n)
ON PhoneNo = prefix+REPLICATE(digit,n)