我需要从表中找到相同的数字电话号码并删除它们。电话号码如下:
+999999999999
11111111
0000000000000
44444444
我正在关注this answer来解决这个问题。我在尝试:
select * from tblPhone where PhoneNo like '^([0-9a-z])\1+$'
但没有成功。 PhoneNo
是varchar。我怎么能做到这一点?
答案 0 :(得分:2)
试试这个:
select *
from tblPhone
where
substring(replace(PhoneNo,'+',''),1,len(replace(PhoneNo,'+',''))-1)
= substring(replace(PhoneNo,'+',''),2,len(replace(PhoneNo,'+','')))
这个想法是,如果从第1个到倒数第二个位置的子字符串匹配从第2个到最后一个的子字符串,则该字符串必须由相同的字符组成。
答案 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
答案 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)