【问题标题】:converting int to real in sqlite在 sqlite 中将 int 转换为 real
【发布时间】:2012-01-08 11:43:54
【问题描述】:

sqlite中的除法返回整数值

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

我们可以对结果进行类型转换以获得除法结果的真实值吗?

【问题讨论】:

    标签: sql sqlite casting division


    【解决方案1】:

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

    SELECT something*1.0/total FROM somewhere
    

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

    【讨论】:

    • 这对 SQLite 3.15 不起作用。@AdamGarner 的解决方案可以。
    • 你真的不应该使用这个技巧,因为开发人员(包括你自己)很容易回来删除看起来像冗余的代码。最佳做法是按照我在下面的建议进行浮动。
    • 这是一个黑客。最好、最明确的方法是使用 CAST。这也有可能在特定情况下搞砸。在基于查询创建表时,我见过这样的事情失败。转换值解决了这个问题。
    【解决方案2】:

    在 Sqlite 中,一个整数除以另一个整数总是会向下舍入到最接近的整数。

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

    SELECT CAST(field1 AS FLOAT) / field2
    

    【讨论】:

    • 那么手动将 int 转换为浮点数还是乘以 1.0 更好(正如@NullUserException 回答的那样)?
    • 是的,原因很简单。您正在明确说明您打算发生的事情。并且不要放入依赖于其他开发人员知道您为什么乘以 1 的东西。
    • @FelixEdelmann 另外,如果您没有明确地将其转换为浮点数,您自己甚至可能会忘记为什么要使用该 1.0,并在某些时候将其删除。它不仅适用于其他开发者。
    • 要补充这一点,正如我在接受的答案中所说,我们有一个字段正在被计算(合法地)并在带有 SELECT 的 CREATE TABLE 中使用,并且值作为 TEXT 值返回(可能已经达到了 NULL 或其他东西)。铸造是唯一为我们解决问题的方法。
    【解决方案3】:
    select cast ( ( select 1 ) as real );
    

    https://www.sqlite.org/lang_expr.html#castexpr

    【讨论】:

      【解决方案4】:

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

      UPDATE table_with_fields SET real_field=cast(field_with_txt AS real)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-13
        • 2021-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-21
        • 1970-01-01
        • 2021-01-12
        相关资源
        最近更新 更多