在SQL中将INT转换为FLOAT

时间:2012-02-23 09:55:18

标签: sql casting

我有这个查询:

   SELECT sl.sms_prefix, sum( sl.parts ) , cp.country_name, CAST(SUM(sl.parts) AS NUMERIC(10,4)) * CAST(cp.price AS NUMERIC(10,4))
FROM sms_log sl, sms_transaction st, country_prefix cp
WHERE st.customer_id =1
AND st.sendtime >=1329865200
AND st.sendtime <=1330037999
AND st.sms_trans_id = sl.trans_id
AND sl.sms_prefix = cp.prefix
AND st.customer_id = cp.customer_id
GROUP BY sl.sms_prefix
LIMIT 0 , 30

结果:

sms_prefix  sum( sl.parts )     country_name    price   total
==================================================================================
45            2                        Denmark   0.01   0.019999999552965
63            3                        Philippines   2  6

如您所见"total"的{​​{1}}不正确,因为Denmarksum( sl.parts )=2相乘,总数应为0.01

价格字段是0.02我怎样才能使总数浮动?

此致

2 个答案:

答案 0 :(得分:32)

虽然@Hiximal的答案有效,但我个人并不推荐。

这是因为它使用 imlicit 强制转换。虽然您没有键入CAST,但在SUM()发生之前,0.0+需要转换为相同的数据类型。在这种情况下,优先顺序对您有利,并且您在两侧都有一个浮点数,并且+会得到一个浮点数。但SUM(aFloatField) + 0不会产生INT,因为0 暗示强制转换为FLOAT。

我发现在大多数编程案例中,最好是显式。不要把事情置于机会,混乱或解释之中。

如果你想明确,我会使用以下内容。

CAST(SUM(sl.parts) AS FLOAT) * cp.price


我不会讨论NUMERIC或FLOAT (固定点,而不是浮点)是否更合适,当涉及到编辑错误等时。我只会让你谷歌,如果你需要但是,FLOAT被大量滥用,以至于有很多关于已经存在的主题的内容。

您可以尝试以下操作来查看会发生什么......

CAST(SUM(sl.parts) AS NUMERIC(10,4)) * CAST(cp.price AS NUMERIC(10,4))

答案 1 :(得分:27)

在oracle db中有一个把int转换为float的技巧(我想,它也适用于mysql):

select myintfield + 0.0 as myfloatfield from mytable