2010-11-19 2 views
5

Necesito limpiar los números de teléfono almacenados como varchar. Hay datos incorrectos en los que los números de teléfono desconocidos se almacenan como una secuencia de un solo dígito. Eventualmente más complejo (código de área & prefijo que empareja) será hecho pero quiero una consulta simple a obviamente malos registros.Pregunta de T-SQL para identificar los campos varchar que constan de un único carácter/dígito de repetición?

Así, por ejemplo:

Válido Número de teléfono: 3289903829

no válida Número de teléfono: 1111111111

Ahora bien, si el ID de producto falso son la longitud adecuada (10 dígitos) es fácil de analizar y limpiar.

SELECT phone 
    FROM customers 
    SET phone = NULL 
    WHERE phone IN ('0000000000','9999999999',''8888888888','7777777777','6666666666','5555555555','4444444444','3333333333','2222222222','1111111111') 

Sin embargo a veces los teléfonos falsos son de longitud arbitraria (probablemente debido a errores tipográficos) SO 11 queridos o 9 queridos, o n queridos.
¿Cómo puedo ID cadenas que consta de todos los mismos caracteres/dígitos?

1111111 - match 
4444 - match 
1112 - no match 
4445555 - no match 

Respuesta

10

Usted puede obtener el primer carácter y replicarlo:

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

También puede usar 'left (phone, 1)' en vez de 'substring (phone, 1,1)'. –

+0

@Mark, gracias se actualizará según su comentario –

+0

@adrift queda (teléfono, 1) más rápido que la subcadena (teléfono, 1,1)? Sólo curioso. –

1

tal vez se podría crear una función de SQL para hacer esto.

creo que los intestinos de los que se vería algo como esto:

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 
+0

Dicho esto, ¡la solución replicada es mucho más elegante! Probablemente vaya con eso. – Brandon

3

Dependiendo de la rapidez con que lo necesita para funcionar, su otra opción es rellenar una tabla temporal y luego unirse a su número de teléfono en él . Si lo haces varias veces, incluso puedes crear una tabla real para que no tengas que volver a crearla en cada ejecución. Para hacerlo más rápido, también puedes indexar el campo. Su millaje de mayo puede variar con la rapidez que necesite para compararlo con el número de registros que tiene que comparar.

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 

De esta manera usted no tiene que volver a calcular el campo que está comparando el número de cada vez.

+0

Como la longitud de estos números de teléfono "especiales" varía, querrá hacer una consulta 'select max (len (phone))' para usar en lugar de '13'. –

+1

que es un buen punto, en realidad me gustaría ver la longitud del campo en la tabla, ya que técnicamente un número de teléfono podría cambiar y el número de teléfono más largo podría ser el actualizado. Al mirar la mesa, sabe que no tendrá un número de teléfono más largo que eso. – kemiller2002

+0

Buena solución.+1 Fui con el método más simple porque en mi caso es una limpieza "única". Colocaré restricciones para evitar datos inválidos. Su método sería la mejor solución para alguien que necesita un fregado periódico de los datos. –

Cuestiones relacionadas