在具有十进制值的列中搜索'.'



我有一个带有 a1 和 a2 浮点列的表,

a2

中的值是从 a1 计算得出的,因为 a2 = 3*a1

条件是:

如果 a1 中的值为 9.5,我需要获取 a2 中的上限值即,如果小数点后的数值大于或等于 5,我需要获取上限值,否则我需要获取下限值。

我在下面写了查询

SET    a2 =(case when substring(cast((a1 * 3) as varchar(6)),CHARINDEX('.',(a1*3)),1) >=5 then CEILING(a1 * 3) else FLOOR(a1 * 3) end) from table

但它显然返回以下错误:

将 varchar 值 '." 转换为数据类型 int 时转换失败。

既然它,不能把瓦尔查尔带到天花板或地板上。

有什么方法可以做到这一点吗?

您的帮助将不胜感激。

a2 的值根据 a1 不断变化,如果 a1 是 4.5 a2 应该是上限,如果 a1 是

4.9,a2 应该再次是上限值,但如果 a1 低于 4.5 作为 4.3,4.2,4.1,那么它应该是下限值

除天花板和地板外,任何其他方法也可以。

使用round()怎么样? 它直接在数据库中实现此逻辑:

set a2 = round(a1, 0);

另一种方法是减去 0.5:

set a2 = floor(a1 + 0.5)

如果您希望a2作为字符串值(您说您想要一个浮点数,但代码返回一个字符串),请使用 str()

set a2 = str(a1)

默认情况下str()舍入。

因为

您尝试比较 varchar>=5,请将其转换为 INT:

SET a2 =(case when cast(substring(cast((a1 * 3) as varchar(6)),CHARINDEX('.',(cast((a1 * 3) as varchar(6))),1) as INT) >=5 then CEILING(a1 * 3) else FLOOR(a1 * 3) end) from table

最新更新