问题:带有 age() 函数的 Postgresql WHERE [重复]

我很确定以前有人问过这个问题,但是我正在努力为包含以下数据的表获取正确的语法

id  date        type                                    report  item_id
1   2018-11-07  Veröffentlichung des 9-Monats-Berichtes TRUE    16
2   2018-11-06  Veröffentlichung des 9-Monats-Berichtes TRUE    17
3   2019-03-07  Veröffentlichung des Jahresberichtes    TRUE    17
4   2019-05-10  Bericht zum 1. Quartal                  TRUE    17

我试图制定的查询是

SELECT date, AGE(now(), date) as t1
FROM dates
WHERE t1 > 0

这意味着我只是在寻找过去的价值。

但是,我收到一个错误

错误:列“t1”不存在

(当然,它是一个别名)。 Postgresql 在这里不支持别名吗?

解答

您不能在WHERE条件中引用别名,因为逻辑上WHERESELECT之前执行。

您可以使用子查询:

SELECT * 
FROM (SELECT date, AGE(now(), date) as t1
      FROM dates) sub
WHERE sub.t1 > interval '0::seconds';

或者LATERAL(我最喜欢的方式):

SELECT date, s.t1
FROM dates
,LATERAL (SELECT AGE(now(), date) as t1) AS s
WHERE s.t1 > interval '0::seconds';

或者重复表达(违反DRY 原则):

SELECT date, AGE(now(), date) as t1
FROM dates
WHERE AGE(now(), date) > interval '0::seconds';

至于计算AGE,你真的不需要它,因为你可以将它重写为date > now()


相关文章:

PostgreSQL:在同一查询中使用计算列

MySQL - 搜索到自定义列

为什么“linq to sql”查询与常规SQL查询不同,以FROM关键字开头?

Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐