在sqlite中将int转换为实数


80

sqlite除法返回整数值

sqlite> select totalUsers/totalBids from 
(select (select count(*) from Bids) as totalBids , 
(select count(*) from Users) as totalUsers) A;
1

我们可以转换结果以获得除法结果的真实价值吗?

Answers:


122

只需将数字之一乘以1.0

SELECT something*1.0/total FROM somewhere

这将为您提供浮点除法而不是整数除法。


4
对于SQLite 3.15,这对我不起作用。@AdamGarner的解决方案可以。
Ma0

1
您确实不应该使用此技巧,因为开发人员(包括您自己)很容易回来并删除看起来像冗余代码的内容。最佳实践将是按以下建议进行浮动。
亚当·加纳

1
这是一个hack。最好,最明确的方法是使用CAST。在特定情况下,这也有可能变本加厉。我已经看到在基于查询创建表时,诸如此类的事情会失败。铸造价值解决了这个问题。
迈克

55

在Sqlite中,一个整数除以另一个整数将始终舍入为最接近的整数。

因此,如果将枚举器转换为浮点数:

SELECT CAST(field1 AS FLOAT) / field2

1
那么最好手动将int强制转换为float或与1.0相乘(如@NullUserException回答)?
菲利克斯·埃德曼

2
是的,原因很简单。您对打算发生的事情很清楚。而在一些依赖于其他开发人员知道你为什么乘以1.不把
亚当·加纳

4
@FelixEdelmann另外,如果您没有显式转换为float,您自己甚至可能会忘记为什么拥有该1.0并在某些时候将其删除。它不仅适用于其他开发人员。
danuker

1
除此之外,正如我在接受的答案中所述,我们有一个字段正在被(合法地)计算并在带有SELECT的CREATE TABLE中使用,并且这些值作为TEXT值返回(可能已经达到NULL或类似的值) )。铸造是唯一为我们解决的问题。
Mike


3

或者如果您想基于文本列更新列:

UPDATE table_with_fields SET real_field=cast(field_with_txt AS real)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.