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

Oracle SQL中CASE WHEN搭配IN子句报错ORA-00907:缺少右括号求助

问题分析与解决

错误原因

Oracle的CASE表达式仅支持返回单个标量值,无法返回多个值组成的集合。你原语句中试图让CASE返回('31', '21', '51', '45', '35')或('12', '13')这类多值集合,违反了语法规则,导致SQL解析器抛出ORA-00907错误(报错信息提示缺少右括号,实际是CASE用法不符合规范)。

另外,由于你使用了LEFT JOIN,需要考虑lomht.ORDER_TRX_ID为NULL的场景(即LMP_ORDER_MW_HOST_TRX中无匹配记录的情况),这类场景应归入ELSE分支的匹配逻辑。

修正后的查询语句

SELECT 
    typ.ID ID, typ.DETAILS DETAILS 
FROM 
    LMP_ORDER_MW_HOST_SVC_TYP typ 
LEFT JOIN 
    LMP_ORDER_MW_HOST_TRX lomht ON typ.ID = lomht.ORDER_SVC_TYP_ID 
WHERE 
    -- 当匹配到TRX记录且ORDER_TRX_ID匹配参数时,命中第一组ID
    (lomht.ORDER_TRX_ID = :ORDER_TRX_ID AND typ.ID IN ('31', '21', '51', '45', '35'))
    -- 当未匹配到TRX记录,或TRX记录的ORDER_TRX_ID不匹配参数时,命中第二组ID
    OR ((lomht.ORDER_TRX_ID != :ORDER_TRX_ID OR lomht.ORDER_TRX_ID IS NULL) AND typ.ID IN ('12', '13'));

另一种等价写法(保留CASE逻辑结构)

如果偏好保留CASE的逻辑组织方式,可以用CASE生成判断标志,再结合IN条件:

SELECT 
    typ.ID ID, typ.DETAILS DETAILS 
FROM 
    LMP_ORDER_MW_HOST_SVC_TYP typ 
LEFT JOIN 
    LMP_ORDER_MW_HOST_TRX lomht ON typ.ID = lomht.ORDER_SVC_TYP_ID 
WHERE 
    (CASE WHEN lomht.ORDER_TRX_ID = :ORDER_TRX_ID THEN 1 ELSE 0 END = 1 
     AND typ.ID IN ('31', '21', '51', '45', '35'))
    OR 
    (CASE WHEN lomht.ORDER_TRX_ID = :ORDER_TRX_ID THEN 1 ELSE 0 END = 0 
     AND typ.ID IN ('12', '13'));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 03:22:16