【问题标题】:SQLITE: unexplainable behaviour - comparison works for some numbers, not for othersSQLITE:无法解释的行为 - 比较适用于某些数字,而不适用于其他数字
【发布时间】:2012-12-13 18:23:17
【问题描述】:

我有一个返回正确结果的查询,除了一些值...不知道为什么。 我正在使用 Chinook 数据库。

SELECT SUM(unitPrice)
FROM invoiceLine
WHERE invoiceId = 5

这将返回 13,86。

SELECT invoiceId, total
FROM invoice 
WHERE invoiceId = 5

这也返回 13,86。现在考虑下一个查询:

SELECT invoiceId, total
FROM invoice
WHERE total = (SELECT SUM(unitPrice)
            FROM invoiceLine
            WHERE invoiceId = 5)

这会返回......什么都没有! 当我更改为 invoiceId = 1 时,我确实得到了与该金额匹配的所有结果。

为什么? (我知道最后一个查询没有多大意义,只是为了清楚地展示问题。

【问题讨论】:

    标签: sql sqlite subquery


    【解决方案1】:

    如果您的发票总额对 2dp 是正确的,您也可以使用

    SELECT invoiceId, total
    FROM invoice
    WHERE total = (SELECT Round(SUM(unitPrice),2)
                FROM invoiceLine
                WHERE invoiceId = 5)
    

    SQL Fiddle demo (with and without round)

    【讨论】:

      【解决方案2】:

      欢迎来到浮点运算的世界,所见即所得。

      尝试类似:

      SELECT invoiceId, total
      FROM invoice i cross join
            (SELECT SUM(unitPrice) as total
                  FROM invoiceLine
                  WHERE invoiceId = 5
            ) i5
      WHERE abs(i.total - i5.total) < 0.001
      

      【讨论】:

      • 你的查询返回了所有的行,但是浮点的思想带来了解决方案。但是,我真正需要的查询是出于教育目的……包括所有这些有点讨厌。 SELECT invoiceId, total FROM invoice WHERE abs(total - (SELECT SUM(unitPrice) FROM invoiceLine WHERE invoiceId = 5))
      猜你喜欢
      • 1970-01-01
      • 2017-03-25
      • 2014-10-12
      • 2015-02-18
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      • 2022-01-03
      • 2021-10-11
      相关资源
      最近更新 更多