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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:28:27