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

