Postgresql WHERE with age() function [duplicate]

本秂侑毒 提交于 2019-12-24 01:58:34

问题


I'm pretty sure this has been asked before but I am struggling to get the correct syntax for a table containing data like

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

The query I am trying to formulate is

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

Meaning I am only looking for values in the past.
However, I get an error

ERROR: column "t1" does not exist

(of course, it is an alias). Does Postgresql not support aliases here?


回答1:


You cannot refer to alias in WHERE condition, because logically WHERE is executed before SELECT.

You could use subquery:

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

Or LATERAL(my favourite way):

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

Or repeat expression(violates DRY principle):

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

As for calculating AGE you don't really need it, because you could rewrite it as date > now().


Related articles:

PostgreSQL: using a calculated column in the same query

MySQL - Search into a custom Column

Why do “linq to sql” queries starts with the FROM keyword unlike regular SQL queries?




回答2:


If you're in a hurry and have an (ordered) index on date don't do that.

Because this query can use the index giving a massive gain in performance at only a slight investment in coding effort.

SELECT date, AGE(now(), date) AS t1
FROM dates
WHERE date > now();

I say now(), because you did, but perhaps you want CURRENT_DATE instead

To create a suitable index do

create index dates_date on dates(date);



来源:https://stackoverflow.com/questions/52576569/postgresql-where-with-age-function

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!