Запрос T-SQL для определения полей varchar, состоящих из одного повторяющегося символа / цифры? - PullRequest
5 голосов
/ 19 ноября 2010

Мне нужно убрать номера телефонов, хранящиеся как varchar. Существуют неверные данные, в которых неизвестные номера телефонов хранятся в виде последовательности из одной цифры. В конце концов, будет сделано более сложное решение (сопоставление кода и префикса), но я хочу просто запрос к явно плохим записям.

Так, например:

Действительный номер телефона: 3289903829

Неверный номер телефона: 1111111111

Теперь, если фиктивный идентификатор продукта имеет правильную длину (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 ]

10 голосов
/ 19 ноября 2010

Вы можете получить первый символ и повторить его:

where phone = replicate(left(phone,1), len(phone))
    and phone is not null
3 голосов
/ 19 ноября 2010

В зависимости от того, насколько быстро вам это нужно, другой вариант - заполнить временную таблицу и затем присоединить к ней свой номер телефона. Если вы делаете это несколько раз, вы можете даже создать реальную таблицу, чтобы вам не приходилось создавать ее заново при каждом запуске. Чтобы сделать это быстрее, вы также можете индексировать поле. Ваш майский пробег может меняться быстро, вам нужно его сравнить с количеством записей, которые вы должны сравнить.

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

Таким образом, вам не нужно пересчитывать поле, с которым вы сравниваете число каждый раз.

1 голос
/ 19 ноября 2010

Может быть, вы могли бы создать функцию 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...