LINE 5: HAVING num > 100

从这里 https://www.postgresqltutorial.com/postgresql-having/ 找到了原因。  Having子句不能使用列的别名,原因在于PG执行sql语句时的解析顺序是这样的,如下图。 可以看到解析having子句时,select语句尚未解析,所以num还未被定义出来。

既然不能使用别名,那就只能再调用聚集函数了

SELECT count(*) AS "num", domain_id 
FROM "concept"
where standard_concept='S'
GROUP BY domain_id
HAVING count(*) > 100
ORDER BY num;
HAVING 子句 HAVING 子句 可以让我们筛选分组后的各组数据。 WHERE 子句 在所选列上设置条件,而 HAVING 子句 则在由 GROUP BY 子句 创建的分组上设置条件。 下面是 HAVING 子句 在 SELECT 查询 的位置: SELECT WHERE GROUP BY HAVING ORDER BY HAVING 子句 必须放置于 GROUP BY 子句 后面,ORDER BY 子句 前面,下面是 HAVING 子句 在 SELECT 语句 基础语法: SELECT column 我们在写SQL时常常会使用where和 having 子句 来进行数据的过滤。但是这两者具体区别在哪呢? PostgreSQL 和其它关系型 数据库 一样也支持聚合函数,一个聚合函数是指从多个输入行 计算出一个结果。 而对于where和 having 子句 最大的区别在于:Where 不能 使用聚合函数,而 having 可以使用聚合函数。 那么为什么会有这种限制呢?我们来看个例子: –找出所有记录 id最大的记录:... 转一篇关于sql语句书写规则的,给自己备忘,也分享出来,转自此文章当select的表达式很长时,我们经常会用as 子句 为该表达式指定 别名 ,然而却发现无法在Where条件 直接使用该 别名 作为判断条件. 例如下面的SQL语句: select id, (c1 + c2) as s from t1 where s > 100 运行会报错: “列名 s 无效” 当然,写成 select id, (c1 ...