PostgreSQL多列使用CASE语句报错:列不存在,如何解决?
问题解决:PostgreSQL中多列CASE语句的正确用法
没问题!咱们直接拆解你的问题:
1. 为什么case when dcs.status = 0 then "follow_up" end as "follow_up"会报错?
你踩了PostgreSQL的一个常见语法坑:双引号在PostgreSQL里是用来引用标识符(比如列名、表名、别名)的,而你这里是想返回一个字符串值follow_up,应该用单引号包裹。用双引号的话,PostgreSQL会误以为你要引用一个名为follow_up的列,而你的表结构里并没有这个列,所以才会报column "follow_up" does not exist的错误。
修正后的语句应该是:
case when dcs.status = 0 then 'follow_up' end as follow_up
(如果你的别名需要特殊格式才用双引号,比如包含空格,否则直接写follow_up就行)
2. 能不能在同一个SELECT语句中对不同列使用多个CASE语句?
当然可以!PostgreSQL完全支持在一个SELECT里同时使用多个CASE语句,分别处理不同的列,甚至可以对同一列嵌套CASE逻辑,这是非常常见的写法。
结合你提到的SELECT DISTINCT ON (pd.id)场景,给你一个完整的示例参考:
SELECT DISTINCT ON (pd.id) pd.id, -- 处理ds.ordinal的CASE语句 CASE WHEN ds.ordinal = 1 THEN 'primary' WHEN ds.ordinal = 2 THEN 'secondary' WHEN ds.ordinal >=3 THEN 'additional' ELSE 'undefined' END as ordinal_category, -- 处理dcs.status的CASE语句(已修正) CASE WHEN dcs.status = 0 THEN 'follow_up' WHEN dcs.status = 1 THEN 'completed' WHEN dcs.status = 2 THEN 'cancelled' ELSE 'unknown_status' END as follow_up FROM your_main_table pd -- 假设你有对应的关联表,根据实际情况调整JOIN逻辑 JOIN ds_table ds ON pd.ds_id = ds.id JOIN dcs_table dcs ON pd.dcs_id = dcs.id -- 注意:DISTINCT ON要求ORDER BY的第一列必须是你指定的pd.id ORDER BY pd.id, ds.ordinal;
额外注意点
DISTINCT ON (pd.id)会返回每个pd.id对应的第一行数据,所以一定要配合ORDER BY子句,并且把pd.id放在ORDER BY的最前面,否则可能会得到不符合预期的结果。- 如果CASE语句里不写
ELSE,那么所有不满足WHEN条件的行都会返回NULL,你可以根据业务需求决定是否需要添加ELSE分支来处理默认情况。
内容的提问来源于stack exchange,提问作者user2954587
相关产品推荐
相关产品推荐

