2013-06-13 36 views
2

我需要一個像下面這DOEN不行查詢:MySQL查詢使用結果的情況下作爲一個變量

SELECT *, 
CASE 
    WHEN x_sutun1 = '1' OR x_sutun2 >= CURRENT_DATE() THEN 0 
    WHEN x_sutun1 < 1 AND x_sutun2 < CURRENT_DATE() THEN 1 
END as mecit 
FROM tablo1 
LEFT JOIN tablo2 ON x_sutun0 = y_sutun0 
LEFT JOIN tablo3 ON x_sutun0 = z_sutun0 
WHERE x_sutun3 + mecit < 4 

如何使用「mecit」作爲一個變量(無存儲過程如果可能的話)。

回答

1

包裹查詢在外部查詢是這樣的:

select * from 
(
SELECT 
* 
, CASE 
    WHEN x_sutun1 = '1' OR x_sutun2 >= CURRENT_DATE() THEN 0 
    WHEN x_sutun1 < 1 AND x_sutun2 < CURRENT_DATE() THEN 1 
END as mecit 
FROM tablo1 
) m 
LEFT JOIN tablo2 ON x_sutun0 = y_sutun0 
LEFT JOIN tablo3 ON x_sutun0 = z_sutun0 
WHERE x_sutun3 + m.mecit < 4 

這樣做的原因是,您使用的別名是不可見的,直到SELECT已經解決了,這是最後一個(或幾乎)最後引擎查看的部分查詢。

注意:如果您在使用的表上存在名稱衝突,則需要限定列名。

1

由於Problems with Column Aliases下記載:

別名可以在查詢選擇列表中用來給一列不同的名稱。您可以使用別名GROUP BYORDER BY,或HAVING子句來引用列:

[ deletia ]

標準SQL不允許在WHERE子句中的列別名引用。施加此限制是因爲在評估WHERE子句時,列值可能尚未確定。

因此,您不能在WHERE子句中使用別名。雖然您可以將過濾器移動到HAVING子句(或外部查詢),但通常效率不高(因爲在計算並返回所有結果之前無法過濾記錄):您最好重複WHERE中的表達式子句直接(更詳細,但更高性能):

SELECT *, 
CASE 
    WHEN x_sutun1 = '1' OR x_sutun2 >= CURRENT_DATE() THEN 0 
    WHEN x_sutun1 < 1 AND x_sutun2 < CURRENT_DATE() THEN 1 
END as mecit 
FROM tablo1 
LEFT JOIN tablo2 ON x_sutun0 = y_sutun0 
LEFT JOIN tablo3 ON x_sutun0 = z_sutun0 
WHERE x_sutun3 + CASE 
    WHEN x_sutun1 = '1' OR x_sutun2 >= CURRENT_DATE() THEN 0 
    WHEN x_sutun1 < 1 AND x_sutun2 < CURRENT_DATE() THEN 1 
END < 4 
相關問題