2010-03-10 12 views
7

Tengo una columna varchar (100) en una tabla que contiene una mezcla de enteros (como cadenas) y cadenas no enteras. P.ej.SQL Server 2005 Convertir VARCHAR a INT pero predeterminado en tipo no válido

| dimension varchar(100) | 
| '5'     | 
| '17'     | 
| '3'     | 
| 'Pyramids'    | 
| 'Western Bypass'  | 
| '15'     | 

¿Cómo puedo escribir una expresión, p. Ej. resumir todos los valores que son enteros válidos? Si tuviera que tratar:

-- should return 5 + 17 + 3 + 15 = 40 
SELECT 
    SUM(CONVERT(INT, dimension)) 
FROM 
    mytable 

iba a recibir un error de Conversion failed when converting the varchar value 'Pyramids' to data type int..

¿Existe alguna prueba que pueda usar en mi expresión, al igual que la función ISNULL(), que me permite especificar un valor predeterminado si el campo no es un número?

Respuesta

20

Prueba esto:

SELECT 
    SUM(CASE ISNUMERIC(dimension) 
      WHEN 1 THEN CONVERT(INT, dimension) 
      ELSE 0 
     END) 
FROM 
    mytable 

el caso debe comprobar si es dimension numérico - si es así, devolverá ese valor. Si no es numérico, devuelva un valor predeterminado (aquí: 0)

Necesita consultar eso con bastante frecuencia, también puede agregar una columna calculada persistente a su tabla que encapsula este cálculo y almacena el valor. De esta manera, cuando sumando y así sucesivamente, no estás siempre vuelve a calcular el valor:

ALTER TABLE mytable 
    ADD NumericValue AS CASE ISNUMERIC(dimension) 
     WHEN 1 THEN CONVERT(INT, dimension) ELSE 0 END PERSISTED 

Ahora, puede SELECT dimension, numericvalue FROM mytable y obtener ambos valores sin ningún cálculo tener que ser ejecutado.

+0

perfecto! ¡Gracias! 'ISNUMERIC ('- 1.44')' y 'ISNUMERIC ('12')' devuelve 1, mientras que 'ISNUMERIC ('foobar')' devuelve 0. Justo lo que necesitaba. –

1

vas a tener problemas de desbordamiento si tiene un varchar como 88888888888888888888888

select 
SUM(
    CASE 
     WHEN ISNUMERIC(CheckCol+ '.0e0') = 1 AND 
     convert(decimal(38,0), CheckCol) 
     BETWEEN -2147483648 AND 2147483647 
    THEN 1 
    ELSE 0 
    END 
) 
from Table 
Cuestiones relacionadas