2011-05-23 93 views
14

我有一个包含字符和数字将varchar转换为float IF ISNUMERIC

12 
13 
14 
19K/YR 
22 

所以列类型为VARCHAR列。但是,我也在用这个列进行一些计算,所以我试图将数据转换为浮点数,如果它是数字的话。

这虽然给我一个错误:

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

你能告诉我们错误是什么吗? – Jim 2011-05-23 03:44:40

回答

29

你不能施放浮动,保持字符串中的同一列。你可以这样做,以获得空当ISNUMERIC返回0

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

+1:打我吧 - 一列不能超过一种数据类型 – 2011-05-23 03:48:56

+5

当然,除了再次ISNUMERIC掉落的事实:'SELECT CASE ISNUMERIC('£2')当1个CAST( '2英镑'浮动)ELSE空END'。有没有人发现过ISNUMERIC可以在没有任何欺骗的情况下使用的情况? – 2011-05-23 04:45:45

11

..extending 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 
    ... 
  • 两种数据类型需要两列
  • 添加e0修复了一些ISNUMERIC issues (如+-.和空字符串被接受)
+0

与涉及'int'的常见问题不同,这个涉及转换为'float' - 那么如果QTY值已经是''1.5e10'(它可以转换为浮点数)呢? – 2011-05-23 04:48:43

+0

@Damien_The_Unbeliever:在这种情况下失败。我个人主要使用小数,所以从来没有需要完全解决 – gbn 2011-05-23 04:55:23

-1

- 尝试这个 -

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

但转换退出不可能

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

我发现这非常恼人的错误,同时将伴随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] 

返回:

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

(3 row(s) affected) 

希望这有助于!