带有 age() 函数的 Postgresql WHERE
Postgresql WHERE with age() function
我很确定之前有人问过这个问题,但我正在努力为包含
等数据的 table 获取正确的语法
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
意思是我只是在寻找过去的值。
但是,我得到一个错误
ERROR: column "t1" does not exist
(当然是别名)。 Postgresql 在这里不支持别名吗?
您不能在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 principle):
SELECT date, AGE(now(), date) as t1
FROM dates
WHERE AGE(now(), date) > interval '0::seconds';
至于计算AGE
你真的不需要它,因为你可以将它重写为date > now()
。
相关文章:
PostgreSQL: using a calculated column in the same query
如果您赶时间并且有日期的(有序的)索引,请不要这样做。
因为此查询可以使用索引,只需少量编码工作即可获得巨大的性能提升。
SELECT date, AGE(now(), date) AS t1
FROM dates
WHERE date > now();
我说 now()
,因为你做到了,但也许你想要 CURRENT_DATE
而不是
要创建合适的索引,请执行
create index dates_date on dates(date);
我很确定之前有人问过这个问题,但我正在努力为包含
等数据的 table 获取正确的语法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
意思是我只是在寻找过去的值。
但是,我得到一个错误
ERROR: column "t1" does not exist
(当然是别名)。 Postgresql 在这里不支持别名吗?
您不能在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 principle):
SELECT date, AGE(now(), date) as t1
FROM dates
WHERE AGE(now(), date) > interval '0::seconds';
至于计算AGE
你真的不需要它,因为你可以将它重写为date > now()
。
相关文章:
PostgreSQL: using a calculated column in the same query
如果您赶时间并且有日期的(有序的)索引,请不要这样做。
因为此查询可以使用索引,只需少量编码工作即可获得巨大的性能提升。
SELECT date, AGE(now(), date) AS t1
FROM dates
WHERE date > now();
我说 now()
,因为你做到了,但也许你想要 CURRENT_DATE
而不是
要创建合适的索引,请执行
create index dates_date on dates(date);