我收到错误:
无法将数据类型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
值。
答案 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的要求是相当罕见的。如果您需要精确度,请使用DECIMAL
或function 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
};
};
。