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
相关产品推荐
相关产品推荐

