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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 17:05:26