无法将 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
值。
【问题讨论】:
你确定你用的是mysql?ISNUMERIC()
在 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 的要求是相当罕见的。如果您需要精度,请使用NUMERIC
或DECIMAL
。
【讨论】:
以上是关于无法将 varchar 转换为浮点数的主要内容,如果未能解决你的问题,请参考以下文章
sklearn-LinearRegression:无法将字符串转换为浮点数:'--'
ValueError:无法将字符串转换为浮点数:'GIAC'