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

