T-SQL查询以识别由单个重复字符/数字组成的varchar字段?

时间:2010-11-19 17:49:02

标签: sql sql-server-2005 tsql

我需要清理存储为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 

3 个答案:

答案 0 :(得分:10)

你可以获得第一个角色并复制它:

where phone = replicate(left(phone,1), len(phone))
    and phone is not null

答案 1 :(得分:3)

根据您运行所需的速度,您可以选择填充临时表,然后将电话号码加入其中。如果你多次这样做,你甚至可以创建一个真正的表,这样你就不必每次运行都重新创建它。为了加快速度,您还可以索引该字段。您的里程数可能会因您需要的速度而有所不同,以便与您需要比较的记录数量进行比较。

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

这样您就不必重新计算每次比较数字的字段。

答案 2 :(得分:1)

也许您可以创建一个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