如何使用postgresql的where子句中我的计算参数(在select子句中)的别名来防止重复?

sdnqo3pr  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(458)

在下面的查询中,参数 date_part('year', CURRENT_DATE) - f.birth_year 重复三次。如何用它的别名替换它 age ?

SELECT
    date_part('year', CURRENT_DATE) - f.birth_year AS age
FROM
    public.foo f
WHERE
    date_part('year', CURRENT_DATE) - f.birth_year >=20 AND
    date_part('year', CURRENT_DATE) - f.birth_year <=30
6qqygrtg

6qqygrtg1#

你不能重复使用 select 中的别名 where 条款。您需要重复表达式,或者使用子查询或cte。
不管它值多少钱,你都可以用 between 只表达一次而不是两次 where 条款:

SELECT date_part('year', CURRENT_DATE) - f.birth_year AS age
FROM public.foo f
WHERE date_part('year', CURRENT_DATE) - f.birth_year BETWEEN 20 AND 30

至于子查询解决方案,应该是:

SELECT *
FROM (
    SELECT date_part('year', CURRENT_DATE) - f.birth_year AS age
    FROM public.foo
) f
WHERE age BETWEEN 20 AND 30
ruyhziif

ruyhziif2#

cte允许您命名表达式,以避免重复它们。顺便说一下,这不是年龄的正确计算方法:

with data as (
    SELECT date_part('year', CURRENT_DATE) - birth_year AS age
    FROM public.foo
)
select * from data
WHERE age >= 20 AND <= 30;

相关问题