【问题标题】:Compare result of 'as' expression in 'where' statement比较'where'语句中'as'表达式的结果
【发布时间】:2008-12-02 17:02:38
【问题描述】:

是否可以创建一个 MySQL 选择语句,使用表达式作为 x,然后检查 x 的值是否低于一定数量?

SELECT (mytable.field1 + 10) AS x FROM `mytable` WHERE x < 50;

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    不,你必须实际这样做

    SELECT (mytable.field1 + 10) AS x FROM `mytable` WHERE (mytable.field1 + 10) < 50;
    

    【讨论】:

    • 这会导致表达式被计算两次,还是数据库足够智能以优化它?就我而言,我正在做一个欧几里得距离算法 (SQRT(POW(a1 - a2, 2) + POW(b1 - b2, 2)… )),所以我宁愿避免计算两次的开销。
    【解决方案2】:

    你也可以这样做:

    SELECT *
    FROM (
        SELECT (mytable.field1 + 10) AS X
        FROM `MyTable`
    ) t
    WHERE X < 50
    

    在大多数情况下,使用 Nick 的解决方案可能会更好,因为它允许服务器在流程的早期应用 where 子句。但是,有时您可能会希望这样做,以便在其他因素推动性能的复杂查询中更加清晰。

    【讨论】:

      【解决方案3】:

      为此,我将表达式存储在变量中并在多个位置插入它们:

      $x_sql = '(mytable.field1 + 10)';
      $SQL = "SELECT $x_sql AS x FROM mytable WHERE $x_sql < 50";
      

      或者,如果您不为效率低下而烦恼,请使用 HAVING 子句:

      SELECT (mytable.field1 + 10) as x FROM mytable HAVING x < 50;
      

      (可能与另一个答案中建议的子选择同样低效)。

      【讨论】:

      • 不,不是。另一个可以优化。
      • 要么可以被优化。 HAVING 肯定不会出现在 mysql 5.0 中,但在我看来子选择也不是。
      猜你喜欢
      • 1970-01-01
      • 2020-04-07
      • 1970-01-01
      • 2019-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 1970-01-01
      相关资源
      最近更新 更多