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

PostgreSQL 8.3中CASE语句报"syntax error at or near 'when'"错误求助

问题分析与修正方案

你遇到的syntax error at or near 'when'错误,核心是CASE语句嵌套结构不完整,还附带了ROUND函数参数格式的问题,咱们一步步拆解解决:

1. CASE语句的核心语法问题

你的内层逻辑在第一个ELSE之后,直接用了when sum(...)——这不符合PostgreSQL的CASE语法规范。每个条件分支都必须属于一个完整的CASE块,要么是CASE WHEN ... THEN ... ELSE ... END的完整结构,要么是CASE <表达式> WHEN ... THEN ... ELSE ... END的形式,这里明显缺少了开启新分支的CASE关键字。

2. ROUND函数的参数错误

ROUND函数的正确格式是ROUND(目标数值, 保留小数位数),你原本把小数位数2直接放在了CAST的括号外面,导致语法结构混乱,需要把它作为ROUND的第二个参数传入。

修正后的完整代码片段

ROUND(
    CAST(
        CASE 
            WHEN x.sprd_units = 0 THEN 0 
            ELSE 
                CASE 
                    -- 第一个判断分支:匹配指定veh_desc_txt的情况
                    WHEN sum(CASE 
                                WHEN d.ver_desc_txt = 'BEST OFFICIAL PROJECTION' 
                                     AND d.veh_desc_txt IN ('CORE BROCHURE','CORE BROCHURE ATTACHED','CORE BROCHURE UNATTACHED') 
                                THEN d.unit_qty 
                                ELSE 0 
                             END) / z.spread_units_cb::numeric IS NOT NULL
                    THEN sum(CASE 
                                WHEN d.ver_desc_txt = 'BEST OFFICIAL PROJECTION' 
                                     AND d.veh_desc_txt IN ('CORE BROCHURE','CORE BROCHURE ATTACHED','CORE BROCHURE UNATTACHED') 
                                THEN d.unit_qty 
                                ELSE 0 
                             END) / z.spread_units_cb::numeric
                    -- 第二个判断分支:不匹配指定veh_desc_txt的情况
                    WHEN sum(CASE 
                                WHEN d.ver_desc_txt = 'BEST OFFICIAL PROJECTION' 
                                     AND d.veh_desc_txt NOT IN ('CORE BROCHURE','CORE BROCHURE ATTACHED','CORE BROCHURE UNATTACHED') 
                                THEN d.unit_qty 
                                ELSE 0 
                             END) / x.sprd_units::numeric IS NOT NULL
                    THEN sum(CASE 
                                WHEN d.ver_desc_txt = 'BEST OFFICIAL PROJECTION' 
                                     AND d.veh_desc_txt NOT IN ('CORE BROCHURE','CORE BROCHURE ATTACHED','CORE BROCHURE UNATTACHED') 
                                THEN d.unit_qty 
                                ELSE 0 
                             END) / x.sprd_units::numeric
                    -- 建议增加默认分支,避免出现NULL值
                    ELSE 0 
                END
        END AS NUMERIC
    ), 2 -- 这里是ROUND函数指定保留2位小数的参数
) AS space_units

额外优化建议

  • 可以给除法操作加上分母非0的判断,比如z.spread_units_cb != 0,避免出现division by zero的运行时错误;
  • 嵌套CASE尽量按层级换行格式化,后续排查语法问题会更轻松,代码可读性也更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:24:28