SQLite WHERE子句比较无法返回预期的结果集

时间:2012-04-26 20:13:07

标签: c# sqlite compare where-clause

我目前正在处理以下代码:

    for (double i = 0.00; i < 5; i += 0.01)
        {
            cmd.CommandText = "SELECT " +
            "COUNT(DISTINCT(ActualAFR)) " +
            "FROM tblBaseLog AS tBL " +
            "INNER JOIN tblSettings AS tSET " +
            "ON tBL.RPM = tSET.RPM " +
            "WHERE MAFVoltage = " + i + " AND " +
            "(tBL.AccelPedalPos > tSET.APPTransition OR " + 
            "tBL.CalculatedLoad > tSET.LoadTransition)";

            int trimCount = Convert.ToInt32(cmd.ExecuteScalar().ToString());

我遇到的问题特定于查询最后一行的WHERE子句比较(特别是tBL.CalculatedLoad&gt; tSET.LoadTransition)。

  1. 这个查询就是从我现有的数据集返回一个结果;此结果是正确的,但不是预期的完整数据集。

  2. 如果我翻转操作数(从大于小于),我得到一个预期但未经验证的结果(基本上是很多数据点)。

  3. 最奇怪的是,如果我以更高的值开始for循环(对于double i = 4.00; ...等),我得到的结果比以前更多。

  4. 现在我已经澄清了正在发生的事情,这里是有关正在使用的数据库的结构/内容的相关信息:

    1. 除了RPM之外,所有内容的表数据类型都设置为REAL,这只是一个普通的INTEGER。

    2. tBL.AccelPedalPos的结果&gt; tSET.APPTransition将永远不会返回true(不要问,此时无关紧要,是的我已将其从查询中删除无效)因此它不是一个因素

    3. tSET.LoadTransition的值几乎总是1,除了日志中早期的1.1

    4. tBL.Calculated Load的值在.2和2之间变化,有数百次十进制值迭代,大于它应该比较的平面1.0。

    5. 我可能遗漏了一些非常简单的事情,但在重新编写查询几十次之后,我在这里打破并寻求帮助。

      值得注意的是,我的计算机有一个“固定的”AMD TLB错误处理器;但是,我已经在运行Core 2 Duo的笔记本电脑上测试了该应用程序的编译版本,结果相同。

      任何意见都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

浮点值的行为与整数值不同;从0.00到5的循环永远不会为i产生4.0的值。

您可能想要指定MAFVoltage的范围(&gt; last_value_of_i AND&lt; = current_value_of_i)或使用decimal来获得类似整数的精度。

要验证我正在讨论的问题是您的情况,请首次记录CommandText属性i大于4 - 它应报告类似{{1 }}