2014-01-06 92 views
1

SELECT声明中,我对当前行执行计算并将其存储在一个列中,我给出了一个别名。 MySQL 5.5.4不允许引用here所述的列别名。有没有办法在SELECT语句中存储变量?

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

代码:

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

HAVING没有GROUP BY作为WHERE,但它看到别名。 – Mihai

+0

@Mihai我不明白你刚写了什么。你可以请扩展它吗? – Lemmings19

+1

替换在哪里。 – Mihai

回答

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的第一个版本更差。

+0

奇妙的是,使用'HAVING'而不是'WHERE'工作得很好!我的问题(不是示例问题)也有一些需要在WHERE中的子句,并且在没有GROUP BY的情况下添加HAVING后,它们继续工作得很好。 – Lemmings19

相关问题