admin

带有age()函数的PostgreSQL WHERE

sql

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

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在这里不支持别名吗?


阅读 190

收藏
2021-06-07

共1个答案

admin

您不能在WHERE条件中引用别名,因为在逻辑上WHERE先执行SELECT

您可以使用子查询:

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()


相关文章:

MySQL-搜索自定义列

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

2021-06-07