2010-01-27 147 views
4

考慮PostgreSQL的以下查詢:PostgreSQL的:使用子查詢的縮寫( 'AS')在WHERE子句中

SELECT 
    a, b, 
    (A VERY LONG AND COMPLICATED SUBQUERY) AS c, 
    (ANOTHER VERY LONG AND COMPLICATED SUBQUERY) AS d 
FROM table 

我想有WHERE子句中cd,如:

WHERE c AND d; 

但是,據我所知,我只能這樣做:

WHERE A VERY LONG AND COMPLICATED SUBQUERY) AND 
    (ANOTHER VERY LONG AND COMPLICATED SUBQUERY) 

哪個笨拙,代碼複製,breaking the single-choice principle和完全醜陋。

順便說一句,同樣的問題適用於SELECT子句:我無法對以前定義的子查詢使用縮寫。

回答

11

你可以使用子查詢:

SELECT a,b,c,d FROM 
    (SELECT 
     a, b, 
     (A VERY LONG AND COMPLICATED SUBQUERY) AS c, 
     (ANOTHER VERY LONG AND COMPLICATED SUBQUERY) AS d 
     FROM table 
    ) AS T1 
WHERE c AND d 

你也可以用CTE做到這一點。

+0

工作。任何想法爲什麼更合理的語法不適用於PostgreSQL環境? – 2010-01-27 10:43:18

+0

對WHERE子句的評估在邏輯上優先於 SELECT列表的評估,所以期望SELECT輸出 在WHERE中可用真的很無意義。 http://archives.postgresql.org/pgsql-general/2002-11/msg01411.php – 2010-01-27 10:46:22

+0

@Adam:我添加了另一個替代方案(CTEs)給我的答案。你也應該檢查一下HAVING子句(它在Gerard的鏈接中也有提到)。 – 2010-01-27 10:54:41