2014-01-06 130 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

相關問題