PostgreSQL的:使用子查询的缩写( 'AS')在WHERE子句中

问题描述:

考虑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子句:我无法对以前定义的子查询使用缩写。

你可以使用子查询:

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