2012-07-04 17 views
0

我用一些這樣的SQL:使用合併或者導致where子句的M​​ySQL

SELECT COALESCE(group.display,item.display) as display.... 

我想在WHERE子句中添加:

WHERE display='1' 

WHERE顯示的結果合併。

同樣地,我希望能夠做同樣的是這樣的:

IF(ISNULL(gd.group_main_image),p.main_image,gd.group_main_image) AS image 
... WHERE image IS NOT NULL 

我怎麼能這樣做嗎?

回答

2

您不能在相同級別的查詢中使用別名。

你必須重複自己。

WHERE COALESCE(group.display,item.display) = '1' 

編輯

嗯,我一直過於嚴格。你可以在MySql的having子句中使用別名。您無法在其他DBMS(Oracle,SQl Server)中執行此操作。通常在ANSI SQL中也是不允許的。

0

不能使用列別名WHERE條款

所以:

WHERE COALESCE(group.display,item.display)='1' 

OR:

HAVING display='1' 

不過,畢竟結果集是HAVING執行發現,所以基本上這是更消耗內存

0

Problems with Column Aliases描述:

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

SELECT SQRT(a*b) AS root FROM tbl_name 
    GROUP BY root HAVING root > 0; 
SELECT id, COUNT(*) AS cnt FROM tbl_name 
    GROUP BY id HAVING cnt > 0; 
SELECT id AS 'Customer identity' FROM tbl_name;

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

SELECT id, COUNT(*) AS cnt FROM tbl_name 
    WHERE cnt > 0 GROUP BY id;

WHERE子句確定哪些行應包括在GROUP BY子句中,但它指的是不知道,直到行已經經過一列值的別名選中,並按GROUP BY分組。