在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
;
我在这个例子中简化了问题。我的实际代码有一个更大的计算,可以多次调用,这可能使这个优化变得有价值。
答案 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
的第一个版本更差。