0

我有一个查询,我需要修改选定的数据,并且我想限制我的数据结果。例如:

SELECT table_id, radians(25) AS rad FROM test_table WHERE rad < 5 ORDER BY rad ASC;

挂起的地方是“rad < 5”,因为根据 codeigniter 没有“rad”列。我尝试将其编写为自定义查询 ($this->db->query(...)),但即使这样也不会让我这样做。我需要根据这个字段限制我的结果。哦,如果我删除 WHERE 过滤器,则 ORDER BY 效果很好。结果是按 rad 字段排序的 ASC。

帮助!!!

4

1 回答 1

1

对于很多DBMS,我们需要在where子句中重复公式/表达式,即

SELECT table_id, radians( 25 ) AS rad 
FROM test_table 
WHERE radians( 25 ) < 5 
ORDER BY radians( 25 ) ASC

但是,在这种情况下,由于计算列是一个常数,因此查询本身并没有多大意义。是否可能缺少部分,例如弧度 (25 * myColumn) 或类似的东西?

编辑(遵循有关公式真实性质的信息等)
您似乎很失望,因为公式需要重复......对此有一些评论:

公式需要显式拼写而不是别名这一事实可能会使查询的可读性降低,编写起来更不有趣等(更多内容见下文),但要考虑的更重要因素是公式中使用的WHERE 子句使 DBMS 为潜在表中的所有记录计算此值!!!

这反过来会以多种方式损害性能:

  • SQL 可能无法使用某些索引,而是必须扫描表(或其部分)
  • 如果公式很重,它会导致响应缓慢和可扩展性较差的服务器

如果WHERE 子句中的附加谓词允许 SQL 过滤掉原本会被处理的 [大量] 记录,那么情况就不会那么糟糕了。此类附加搜索标准可能由应用程序驱动(例如,除了辐射条件,该位置的 [无关] 高度必须低于 6,000 英尺),或者可以“人为”添加此类标准以帮助查询(例如,您可能知道一个粗略的启发式方法,它不足以在可接受的精度内计算“弧度”值,但可能足以过滤掉 70% 的记录,只保留那些有机会满足“弧度”所需的确切范围。

现在有一些关于公式本身的技巧,以使其更快:

  • 请记住,您可能不需要运行 100% 的教科书公式。
    我不确定大圆数学的哪一部分与这个弧度计算相关,但一般来说,一些公式包括一个昂贵的步骤,例如平方根提取、对三角函数的调用等。在某些情况下通过将反向步骤应用于谓词的另一侧(通常只需要评估一次),可以简化公式(必须为许多记录/值运行)。例如,如果说搜索条件谓词是"WHERE SQRT((x1-x2)^2 + (y1-y2)^2) > 5". 由于距离的计算涉及找到平方根(平方差的总和),因此可以决定删除平方根,而是将这个修改后的公式的结果与距离值的平方进行比较,即"WHERE ((x1-x2)^2 + (y1-y2)^2) > (5^2)"
  • 根据您的 SQL/DBMS 系统,可以在自定义函数中实现公式,这将使其更高效(因为“预编译”,可能用更好的语言编写等)并且更短参考,在 SQL 查询本身中(尽管它需要被列出两次,如前所述)
  • 根据情况,还可以更改数据库模式和底层应用程序,使公式(或其部分)预先计算和索引,从而为 DBMS 节省基于函数的谓词的冗长解析。
于 2009-11-17T01:35:55.740 回答