[英]using regex to find same digit phone numbers
我需要從表中查找相同數字的電話號碼並將其刪除。 電話號碼如下:
+999999999999
11111111
0000000000000
44444444
我正在按照這個答案來解決這個問題。 我在嘗試 :
select * from tblPhone where PhoneNo like '^([0-9a-z])\1+$'
但沒有成功。 PhoneNo
是varchar。 我該如何實現?
嘗試這個:
select *
from tblPhone
where
substring(replace(PhoneNo,'+',''),1,len(replace(PhoneNo,'+',''))-1)
= substring(replace(PhoneNo,'+',''),2,len(replace(PhoneNo,'+','')))
這個想法是,如果從第一個到倒數第二個位置的子字符串與從第二個到倒數第二個位置的子字符串匹配,則該字符串必須由相同的字符組成。
這是一個主意。 第一個字符有問題,可以是+
或數字。 讓我們用第二個字符替換一個空字符串,然后看一下結果:
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 '+%'
)
您可以使用patindex在SQL Server中進行模式匹配,但是不直接支持正則表達式。 但是,如果您使用.Net和CLR用戶定義的函數 ,則是有希望的。
創建表#temp(col1 varchar(25))
插入#temp值('+9999999')
插入#temp值('+123456789')
插入#temp值('+444444444')
插入#temp值('+9840536987')
從#temp中選擇*
開始翻譯
從#temp中選擇*
從#temp中刪除,其中cast(replace(replace(col1,'+',''),RIGHT(replace(col1,'+',''),1),0)as bigint)= 0
從#temp中選擇*
回滾轉換
您可以嘗試以下方法:
SELECT *
FROM tblPhone
WHERE
CAST(PhoneNo AS BIGINT) = REPLICATE(RIGHT(PhoneNo, 1), LEN(CAST(PhoneNo AS BIGINT)))
要么
SELECT *
FROM tblPhone
WHERE REPLACE(PhoneNo, RIGHT(PhoneNo, 1),'') IN ('+','')
這將生成該集合中所有可能的無效電話號碼(這是一個非常小的數字),並將其加入到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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.