2011-05-23 16 views
14

tengo una columna que contiene caracteres y númerosConvertir varchar flotar SI ISNUMERIC

12 
13 
14 
19K/YR 
22 

lo tanto, el tipo de columna es de tipo varchar. Pero también estoy haciendo algunos cálculos con esta columna, así que estoy tratando de convertir los datos en flotantes si son numéricos.

Esto me da un error sin embargo:

SELECT CASE ISNUMERIC(QTY) 
     WHEN 1 THEN CAST(QTY AS float) 
     ELSE QTY 
     END AS test 
+0

¿Puede decirnos cuál es el error? – Jim

Respuesta

29

no se puede convertir a flotar y mantener la cadena en la misma columna. Se puede hacer como esto para conseguir nulos cuando los rendimientos IsNumeric 0.

SELECT CASE ISNUMERIC(QTY) WHEN 1 THEN CAST(QTY AS float) ELSE null END 
+1

+1: Muéstremelo: una columna no puede contener más de un tipo de datos –

+5

Excepto, por supuesto, por el hecho de que una vez más ISNUMERIC cae: 'SELECCIONE EL CASO ISNUMÉRICO ('£ 2') CUANDO 1 YA CASTIGA ('£ 2' AS float) ELSE null END'. ¿Alguna vez alguien ha descubierto una circunstancia en la que se puede usar ISNUMERIC sin algunos distorsiones? –

11

..extending respuestas Mikaels'

SELECT 
    CASE WHEN ISNUMERIC(QTY + 'e0') = 1 THEN CAST(QTY AS float) ELSE null END AS MyFloat 
    CASE WHEN ISNUMERIC(QTY + 'e0') = 0 THEN QTY ELSE null END AS MyVarchar 
FROM 
    ... 
  • Dos tipos de datos requiere dos columnas
  • Adición e0 corrige algunos ISNUMERIC issues (como +-. y cadena vacía aceptada)
+0

A diferencia de las preguntas habituales que implican 'int's, esta implica la conversión a' float', entonces, ¿qué sucede si el valor de QTY ya es ''1.5e10'' (que se puede convertir en float)? –

+0

@Damien_The_Unbeliever: falla en este caso. Personalmente utilizo decimales en su mayoría, así que nunca tuve la necesidad de resolverlo completamente – gbn

-1

- Quizás -

select name= case when isnumeric(empname)= 1 then 'numeric' else 'notmumeric' end from [Employees] 

Pero la conversión es dejar de fumar imposible

select empname= 
case 
when isnumeric(empname)= 1 then empname 
else 'notmumeric' 
end 
from [Employees] 
2

me encontré con este error muy molesto, mientras que la conversión de los valores de empleado con ISNUMERIC:

SELECT DISTINCT [EmployeeID], 
ISNUMERIC(ISNULL([EmployeeID], '')) AS [IsNumericResult], 

CASE WHEN COALESCE(NULLIF(tmpImport.[EmployeeID], ''), 'Z') 
    LIKE '%[^0-9]%' THEN 'NonNumeric' ELSE 'Numeric' 
END AS [IsDigitsResult] 
FROM [MyTable] 

Esto devuelve:

 
EmployeeID IsNumericResult MyCustomResult 
---------- --------------- -------------- 
      0    NonNumeric 
00000000c 0    NonNumeric 
00D026858 1    NonNumeric 

(3 row(s) affected) 

Espero que esto ayude!