无法将 varchar 转换为浮点数

Posted

技术标签:

【中文标题】无法将 varchar 转换为浮点数【英文标题】:Cannot convert varchar to float 【发布时间】:2015-08-25 15:12:52 【问题描述】:

我得到错误:

无法将数据类型 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 值。

【问题讨论】:

你确定你用的是mysqlISNUMERIC() 在 mysql 中不存在。我认为您使用 MS SQL Server。对吗? 是的 sql server 2008..你能帮帮我吗? 您的选择是正确的。我认为从 CASE 返回的值存在问题。你在哪里使用这个值? 我在视图中使用这个值。 好的,你能告诉我们吗? 【参考方案1】:

此代码应该适用于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;

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

【讨论】:

无论如何我都需要那个 +.00 部分,所以我不能删除它。它也没有任何指数值。我检查了。 你能告诉我为什么会发生这种情况的其他原因吗? @LintaSheelkumar 。 . .为什么需要+ '0.00'?它对 case 表达式的返回值没有影响。无论如何,返回值都是浮点数,零没有意义。 @LintaSheelkumar 。 . .也许错误在代码的其他部分。如答案中所述,SELECT 不应产生该错误。 where 也不应该(如果b 是字符串,则错误将涉及int 而不是float)。【参考方案2】:

假设您没有成为ISNUMERIC() 中的任何怪癖的牺牲品,例如ISNUMERIC(','),我认为您已经陷入了与here 描述的相同问题。正如那张海报雄辩地指出的那样,“声明的顺序并不意味着执行的顺序”

换句话说,只是因为你说

CASE WHEN ISNUMERIC(c) = 1 
    THEN (CASE WHEN c LIKE '%.%' 
        THEN CAST(c AS FLOAT) 
        ELSE c + '.00' END) 
ELSE '0.00' END

并不意味着ISNUMERIC(c) = 1 将控制CAST(c AS FLOAT) 的执行方式。控制执行顺序的唯一方法是完全使用不同的子句。在这种情况下,您应该使用 WHERE 子句和 UNION ALL 结果。

另外,请注意 CASE WHEN c LIKE '%.%' THEN CAST(c AS FLOAT) ELSE c + '.00' END 在功能上与 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。它不是一种精确的数据类型,而且精度不是 RDBMS 的要求是相当罕见的。如果您需要精度,请使用NUMERICDECIMAL

【讨论】:

以上是关于无法将 varchar 转换为浮点数的主要内容,如果未能解决你的问题,请参考以下文章

sklearn-LinearRegression:无法将字符串转换为浮点数:'--'

ValueError:无法将字符串转换为浮点数:'GIAC'

无法将数组转换为浮点数python

ValueError:无法将字符串转换为浮点数:'Bad'

ValueError:无法将字符串转换为浮点数:'2100 - 2850'

我收到 ValueError:无法将字符串转换为浮点数:'8,900' [重复]