在SQLite中将整数转换为实数

109

SQLite中的除法会返回整数值

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

我们能否将结果转换类型以获取除法结果的实际值?

4个回答

161

只需要将其中一个数字乘以1.0

SELECT something*1.0/total FROM somewhere

这将给你浮点数除法而不是整数除法。


5
在SQLite 3.15上,这对我没有用。 @AdamGarner的解决方案可行。 - Ma0
2
你真的不应该使用这个技巧,因为开发人员(包括你自己)很容易回来删除看起来多余的代码。 最好的做法是按照我下面建议的将其转换为浮点数。 - Adam Garner
3
这是一个技巧。最好、最明确的方法是使用CAST。在特定情况下,这也可能会出现问题。我曾经看到类似的东西在基于查询创建表时失败。转换数值可以解决这个问题。 - Mike
任何使用sqlite的人都会知道为什么有*1.0。为什么sqlite这么烦人,唉,甚至不能正确地除以数字:( - chrismarx

79
在SQLite中,一个整数被另一个整数除时,结果总是向下取整到最接近的整数。因此,您需要将分子强制转换为浮点数:
SELECT CAST(field1 AS FLOAT) / field2

1
那么,手动将int转换为float更好,还是像@NullUserException所回答的那样乘以1.0呢? - Felix Edelmann
4
是的,有一个简单的原因。你明确表达了你想要发生什么事情。而不是放置一些依赖于其他开发人员知道你为什么乘以1的东西。 - Adam Garner
5
如果你没有明确地将其转换为浮点数,你自己甚至可能会忘记为什么有那个1.0,并在某个时候将其删除。这不仅适用于其他开发人员。 - danuker
1
此外,正如我在被接受的答案中所述,我们有一个字段正在被计算(合法地),并且在使用SELECT创建表时,值以TEXT值返回(可能已经触发了NULL或其他什么)。转换是唯一修复它的方法。 - Mike

12

4

如果你想根据文本列更新列:

UPDATE table_with_fields SET real_field=cast(field_with_txt AS real)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接