在PostgreSQL中,having子句的别名

在 MySQL 中本应可用的 having 子句的别名却无法使用。

在PostgreSQL中,不能在SELECT语句的HAVING子句中使用别名。

 

SELECT
    status,
    count(*) AS status_count
FROM
    Users
GROUP BY status
HAVING status_count > 10;

在PostgreSQL中,HAVING子句在执行顺序上优先于SELECT子句进行评估。
因此,在PostgreSQL中需要按照以下方式编写。

SELECT
    status,
    count(*) AS status_count
FROM
    "Users"
GROUP BY status
HAVING count(*) > 10;

我注意到同一个count(*)被重复写了两次,感到困扰。
当count(*)的部分变成更复杂的计算式或条件分支时,可能会变得冗长。

可以漂亮地写

WITH user_status_counts as (
    SELECT
        status,
        count(*) AS status_count
    FROM
        "Users"
    GROUP BY status
)
SELECT * from user_status_counts usc WHERE usc.status_count > 10;

使用WITH的话,count(*)那部分应该可以在一次内就完成。