首页 > 解决方案 > 如何在postgresql的WHERE子句中使用CASE语句的END变量?

问题描述

假设我有这个查询

SELECT 
s.name,
s.last_name,
s.created_date,
s.new_flag,
s.enrolled_date

CASE WHEN s.created_date IS NOT NULL AND s.new_flag IS = 0 THEN s.enrolled_date ELSE s.exit_date 
END filter_query
FROM student.s WHERE TO_CHAR(filter_query,'YYYY-MM-DD') = TO_CHAR(NOW(), 'YYYY-MM-DD');

上面的这个查询说 filter_query 列不存在。我们怎样才能使这个 filter_query 在TO_CHAR函数中工作?

标签: postgresql

解决方案


您不能filter_queryWHERE条件中的表达式使用别名,因为条件是在列表之前WHERE评估的。SELECT

您可以使用子查询:

SELECT name,
       last_name,
       created_date,
       new_flag,
       enrolled_date,
       filter_query
FROM (SELECT s.name,
             s.last_name,
             s.created_date,
             s.new_flag,
             s.enrolled_date,
             CASE WHEN s.created_date IS NOT NULL
                       AND s.new_flag IS = 0
                  THEN s.enrolled_date
                  ELSE s.exit_date 
             END filter_query
      FROM student.s) AS subq
WHERE TO_CHAR(filter_query, 'YYYY-MM-DD') = TO_CHAR(NOW(), 'YYYY-MM-DD');

推荐阅读