You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中CASE生成列加双引号后过滤列不存在问题求解

PostgreSQL别名双引号报错原因解析

你用到的loans表结构如下:

id int
user_id int
created_at datetime
status varchar
type varchar

报错核心原因

问题本质是PostgreSQL的标识符匹配规则:双引号包裹的标识符会强制保留大小写,无引号包裹的标识符默认会转为小写后再做匹配。

  • 内层子查询中你用双引号包裹了"Refinancecount"、"Inschoolcount"作为聚合列别名,PostgreSQL会严格保留这两个别名的大小写格式,子查询返回的列名就是首字母大写的Refinancecount、Inschoolcount。
  • 外层WHERE条件中你写的a.Refinancecount没有加双引号,PostgreSQL会默认把这个标识符转为全小写的refinancecount去匹配子查询返回的列,两边名称不匹配就会触发找不到列的报错。

为什么有的资料里双引号包裹别名可用

你看到的其他双引号包裹别名的案例,要么是别名本身就是全小写格式,要么是引用别名的时候也加了完全一致的双引号,你如果把外层WHERE条件改成下面的写法也可以正常运行:

where a."Refinancecount">=1 and a."Inschoolcount">=1

更简洁的推荐写法

日常使用建议别名不要加双引号,避免大小写匹配问题,也可以直接省略子查询用HAVING过滤,执行效率更高:

select user_id
from loans
group by user_id
having 
    sum(case when type='Refinance' then 1 else 0 end) >= 1
    and sum(case when type='InSchool' then 1 else 0 end) >= 1

内容的提问来源于stack exchange,提问作者Lokesh Varshney

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 13:24:02