[英]T-SQL Query to identify varchar fields that consist of a single repeating char/digit?
我需要清理存储为varchar的电话号码。 存在不良数据,其中未知电话号码被存储为单个数字的序列。 最终会完成更复杂的(区域代码和前缀匹配)但我想简单查询明显不好的记录。
例如:
有效电话号码:3289903829
电话号码无效:1111111111
现在,如果伪造的产品ID是合适的长度(10位数),则很容易解析和清理。
SELECT phone
FROM customers
SET phone = NULL
WHERE phone IN ('0000000000','9999999999',''8888888888','7777777777','6666666666','5555555555','4444444444','3333333333','2222222222','1111111111')
然而,有时假电话是任意长度的(可能是由于拼写错误)所以11个或9个,或n个。
如何识别包含所有相同字符/数字的字符串?
1111111 - match
4444 - match
1112 - no match
4445555 - no match
您可以获取第一个字符并复制它:
where phone = replicate(left(phone,1), len(phone))
and phone is not null
根据您运行所需的速度,您的另一个选择是填充临时表,然后在其上加入您的电话号码。 如果你多次这样做,你甚至可以创建一个真正的表,这样你就不必每次运行都重新创建它。 为了加快速度,您还可以索引该字段。 您的里程数可能会因您需要的速度而有所不同,以便与您需要比较的记录数量进行比较。
CREATE TABLE #Numbers
(
PhoneNumber VARCHAR(13) NOT NULL
)
DECLARE @run BIT
SET @run = 1
DECLARE @number INT
SET @number = 1
DECLARE @Counter INT
SET @Counter = 1
WHILE(@run = 1)
BEGIN
WHILE(@Counter < 13)
BEGIN
INSERT INTO #Numbers
SELECT REPLICATE(@number,@counter)
SET @Counter = @Counter + 1
END
SET @Counter = 1
SET @number = @number + 1
IF(@number > 9)
BEGIN
SET @run = 0
END
END
SELECT * FROM Phone p JOIN #numbers n ON p.PhoneNumber = n.PhoneNumber
这样您就不必重新计算每次比较数字的字段。
也许您可以创建一个SQL函数来执行此操作。
我认为它的内容看起来像这样:
DECLARE @field varchar(10)
SET @field = '11111'
DECLARE @len INT
SET @len = LEN(@field)
DECLARE @counter INT
SET @counter = 1
DECLARE @firstChar VARCHAR(1)
SET @firstChar = NULL
DECLARE @currentChar VARCHAR(1)
SET @currentChar = NULL
DECLARE @allSameNumber BIT
SET @allSameNumber = 1
WHILE @counter <= @len AND @allSameNumber = 1 BEGIN
SET @currentChar = SUBSTRING(@field,@counter,1)
IF @firstChar IS NULL BEGIN
SET @firstChar = @currentChar
END
IF NOT ISNUMERIC(@currentChar) = 1 OR NOT @currentChar = @firstChar BEGIN
SET @allSameNumber = 0
END
SET @counter = @counter + 1
END
SELECT @allSameNumber
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.