Oracle SQL中CASE语句报错ORA-00936:缺失表达式求助
解决Oracle SQL中CASE语句的ORA-00936错误问题
嘿,我来帮你搞定这个报错问题~你遇到的ORA-00936: missing expression错误,根源是把HAVING子句错误地放到了CASE的WHEN条件里——HAVING是用来分组后过滤结果集的语法,不能直接作为CASE的判断条件使用。
下面给你两种符合需求的正确写法,你可以根据实际场景选择:
场景1:保留原表所有行,每行标记对应TITLE的重复状态
如果你需要保留数据表中的每一行,同时给每行加上对应TITLE是否重复的标记,用窗口函数是最便捷的方式:
SELECT CE.TITLE, -- 用窗口函数计算当前TITLE在全表的出现次数 CASE WHEN COUNT(CE.TITLE) OVER (PARTITION BY CE.TITLE) > 1 THEN 'More' ELSE 'ok' END AS "more than one job" -- 带空格的别名需要用双引号包裹,或换成下划线更规范 FROM YOUR_TABLE CE; -- 替换成你的实际表名
这里的COUNT(CE.TITLE) OVER (PARTITION BY CE.TITLE)会为每一行计算其所属TITLE的总出现次数,这样就能直接在CASE里判断是否重复。
场景2:仅分组展示每个TITLE的重复状态
如果你的需求是只汇总每个TITLE的状态(不需要保留原表所有行),可以用GROUP BY配合CASE:
SELECT CE.TITLE, CASE WHEN COUNT(CE.TITLE) > 1 THEN 'More' ELSE 'ok' END AS "more than one job" FROM YOUR_TABLE CE GROUP BY CE.TITLE;
这种写法会先按TITLE分组,计算每组的行数,再根据行数判断返回'More'还是'ok'。
另外提醒一下:Oracle中如果别名包含空格,需要用双引号包裹,或者你可以换成more_than_one_job这种无空格的别名,避免不必要的语法问题。
内容的提问来源于stack exchange,提问作者Maddie Graham
相关产品推荐
相关产品推荐

