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

CASE语句用于JOIN触发ORA-00905错误的解决问询

解决ORA-00905:LEFT JOIN ON子句中CASE语句的错误

你的代码报错是因为Oracle的CASE表达式不能直接返回布尔条件(比如1=1),它只能返回具体的数值或字符串类型的值,所以原来的写法违反了语法规则。

最优解决方案:用逻辑表达式替代CASE

最简洁且高效的写法是直接使用逻辑或(OR)来实现需求,完全不需要CASE:

SELECT cce.ITEM_NUMBER, DEF.SEGMENT1
FROM INV_CYCLE_COUNT_ENTRIES cce
LEFT OUTER JOIN inv_item_loc_defaults DEF 
  ON DEF.INVENTORY_ITEM_ID = cce.INVENTORY_ITEM_ID  -- 修正原代码中FEF的笔误,应为DEF
  AND DEF.SUBINVENTORY_CODE = cce.SUBINVENTORY
  AND DEF.DEFAULT_TYPE = 2
  AND (cce.LOCATOR_ID IS NULL OR DEF.LOCATOR_ID = cce.LOCATOR_ID)

这个逻辑的作用:

  • 当cce.LOCATOR_ID为NULL时,cce.LOCATOR_ID IS NULL为真,整个括号内的条件直接成立
  • 当cce.LOCATOR_ID不为NULL时,会触发DEF.LOCATOR_ID = cce.LOCATOR_ID的判断,满足你的匹配要求

若坚持使用CASE的写法

如果一定要用CASE表达式,可以通过让CASE返回匹配值的方式实现:

SELECT cce.ITEM_NUMBER, DEF.SEGMENT1
FROM INV_CYCLE_COUNT_ENTRIES cce
LEFT OUTER JOIN inv_item_loc_defaults DEF 
  ON DEF.INVENTORY_ITEM_ID = cce.INVENTORY_ITEM_ID
  AND DEF.SUBINVENTORY_CODE = cce.SUBINVENTORY
  AND DEF.DEFAULT_TYPE = 2
  AND DEF.LOCATOR_ID = CASE 
                         WHEN cce.LOCATOR_ID IS NULL THEN DEF.LOCATOR_ID 
                         ELSE cce.LOCATOR_ID 
                       END

原理:

  • 当cce.LOCATOR_ID为NULL时,CASE返回DEF.LOCATOR_ID,此时DEF.LOCATOR_ID = DEF.LOCATOR_ID恒成立
  • 当cce.LOCATOR_ID不为NULL时,CASE返回cce.LOCATOR_ID,实现两者相等的判断

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 08:07:16