SQL查询CASE表达式报错:column "yesterday"不存在问题排查
问题原因及修正方案
错误根源
报错是因为PostgreSQL中双引号(")用于引用数据库对象名(如列名、表名),你在CASE语句里用双引号包裹"yesterday"、"last_month",数据库会把它们当成列名查找,自然找不到对应列,所以触发错误。
另外你的日期判断逻辑存在漏洞:直接用EXTRACT(DAY FROM now()) - EXTRACT(DAY FROM inserted_at)判断是否为昨天,跨月场景会失效(比如今天是1号,inserted_at是上月30号,差值为-29,无法触发条件);判断上月的逻辑同理,跨年时也会出错。
修正后的SQL语句
SELECT 'EMAIL' AS comm_mode ,EXTRACT(epoch FROM (sent_at - inserted_at)) AS duration ,CASE WHEN inserted_at::date = (NOW() AT TIME ZONE 'utc' - INTERVAL '1 day')::date THEN 'yesterday' WHEN date_trunc('month', inserted_at AT TIME ZONE 'utc') = date_trunc('month', (NOW() AT TIME ZONE 'utc') - INTERVAL '1 month') THEN 'last_month' WHEN date_trunc('week', inserted_at AT TIME ZONE 'utc') = date_trunc('week', (NOW() AT TIME ZONE 'utc') - INTERVAL '1 week') THEN 'last_week' ELSE 'irrelevant' END AS time_period FROM communications_email WHERE status = 'sent' AND inserted_at >= (NOW() AT TIME ZONE 'utc' - INTERVAL '45 day')
关键修正点
- 将字符串值的双引号替换为单引号('),让数据库识别为字符串常量
- 改用
::date转换为日期类型判断是否为昨天,避免跨月问题 - 用
date_trunc函数按月/周截断日期,准确判断是否为上月/上周,同时统一使用UTC时区保持一致性 - 添加
ELSE 'irrelevant'分支,满足其余情况的返回要求
内容的提问来源于stack exchange,提问作者user9771807
相关产品推荐
相关产品推荐

