有没有办法在SELECT语句中存储变量?

时间:2014-01-06 18:47:29

标签: mysql

SELECT语句中,我对当前行执行计算并将其存储在我给出别名的列中。 MySQL 5.5.4不允许引用here所述的列别名。

有没有办法实现如下所示的理想代码?我想避免一遍又一遍地进行同样的计算。我认为将计算的初始结果存储到变量(每行唯一)并引用该变量将是最有意义的。

有效的代码:

SELECT
  DATEDIFF(CURDATE(), example_table.date_start) AS daysElapsed
FROM
  example_table
WHERE
  DATEDIFF(CURDATE(), example_table.date_start) > 30
  AND
  DATEDIFF(CURDATE(), example_table.date_start) < 60
;

理想代码:(由于您无法引用列alais,因此无效)

SELECT
  DATEDIFF(CURDATE(), example_table.date_start) AS daysElapsed
FROM
  example_table
WHERE
  daysElapsed > 30
  AND
  daysElapsed < 60
;

我在这个例子中简化了问题。我的实际代码有一个更大的计算,可以多次调用,这可能使这个优化变得有价值。

1 个答案:

答案 0 :(得分:2)

通常,SQL不允许where子句中的列别名。但是,它确实允许having子句中的列别名。所以,你可以这样做:

SELECT DATEDIFF(example_table.date_start, CURDATE()) AS daysElapsed
FROM example_table
HAVING daysElapsed > 30 AND daysElapsed < 60;

在SQL的大多数方言中,这可能是错误(having没有group by)或全局聚合(即总是返回一行)。在MySQL中,having在这种情况下的行为类似于where

使用标准SQL,您将使用子查询:

select daysElapsed
from (SELECT DATEDIFF(example_table.date_start, CURDATE()) AS daysElapsed
      FROM example_table
     ) et
where daysElapsed > 30 AND daysElapsed < 60;

您也可以在MySQL中执行此操作。但是,MySQL倾向于实现子查询,因此性能可能比使用having的第一个版本更差。