无法将varchar转换为float

时间:2015-08-25 15:12:53

标签: sql sql-server sql-server-2008

我收到错误:

  

无法将数据类型varchar转换为float

用于以下sql语句:

SELECT
    a, b,
    CASE 
       WHEN ISNUMERIC(c) = 1 
          THEN (CASE WHEN c LIKE '%.%' 
                       THEN CAST(c AS FLOAT) 
                       ELSE c + '.00' END) 
          ELSE '0.00' END
FROM
    table_name
WHERE
    b = 17

请帮忙。

此处c是一列数据类型varchar(50)

我无法将其声明为float数据类型,因为我需要在其中存储一些varchar值。

2 个答案:

答案 0 :(得分:2)

此代码适用于c的合理值:

Select (CASE WHEN ISNUMERIC(c) = 1
             THEN (CASE WHEN c LIKE '%.%' THEN c ELSE c + '.00' END)
             ELSE '0.00'
        END)
from table_name
where b = 17;

因此,您必须具有不合理的价值。我的猜测是你有类似'3e4'的东西,它是指数符号。然后转换'3e40.00'时会出错。

您的代码本身没有多大意义。从case返回的值是一个浮点数。所以,就这样做:

Select (CASE WHEN ISNUMERIC(c) = 1
             THEN CAST(c as FLOAT)
             ELSE 0.00
        END)
from table_name
where b = 17;

这在功能上是等效的,而且更简单。

答案 1 :(得分:0)

假设你没有像ISNUMERIC() ISNUMERIC(',')那样陷入CASE WHEN ISNUMERIC(c) = 1 THEN (CASE WHEN c LIKE '%.%' THEN CAST(c AS FLOAT) ELSE c + '.00' END) ELSE '0.00' END 中的任何怪癖,我认为你已陷入here描述的同一问题。正如那张海报如此雄辩地说,“声明的顺序并不意味着执行的顺序”

换句话说,只因为你说

ISNUMERIC(c) = 1

并不意味着CAST(c AS FLOAT)将控制CASE WHEN c LIKE '%.%' THEN CAST(c AS FLOAT) ELSE c + '.00' END的执行方式。控制执行顺序的唯一方法是完全使用不同的子句。在这种情况下,您应该使用WHERE子句和UNION ALL结果。

另请注意,CAST(c AS FLOAT)在功能上与仅说SELECT a, b, CAST(0.00 AS FLOAT) FROM table_name WHERE b = 17 AND ISNUMERIC(c) <> 1 UNION ALL SELECT a, b, CAST(c AS FLOAT) FROM table_name WHERE b = 17 AND ISNUMERIC(c) = 1 相同,因为每列只允许一种数据类型。

这意味着你需要这样做:

FLOAT

除此之外,考虑一下你是否真的想NUMERIC。它不是一种精确的数据类型,并且精确度不是RDBMS的要求是相当罕见的。如果您需要精确度,请使用DECIMALfunction difference(randomArray){ var origSum = function () { var sum = 0; for (var i = 0; i < randomArray.length; i++ ) { sum += randomArray[i] }; return sum; }; var maxi = function () { var max = 0; // What if all array values are negative? for (var x = 0; x < randomArray.length; x++) { if (randomArray[x] > max) { max = randomArray[x] }; }; return max; }; var sum = function () { return ((maxi() * randomArray.length) - origSum()) // < here }; if (randomArray.length <= 1) { return (1 - 2) // This is weird ? } else { return sum(); // < and here }; };