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

使用CASE搭配WHERE子句遇ORA-00905错误:BETWEEN缺失关键字

ORA-00905错误分析与解决

错误原因

你的SQL语句存在两个关键语法问题:

  • CASE语句结构错误:WHEN :P_PIM_DATE1 IS NOT NULL AND :P_PIM_DATE2 IS NOT NULL)里多了一个多余的右括号,直接破坏了CASE的语法结构,导致解析器无法匹配正确的关键字。
  • Oracle CASE表达式不支持直接返回布尔值:你试图在THEN子句中写T.F_DATE BETWEEN :P_PIM_DATE1 AND :P_PIM_DATE2(这是一个布尔判断),但Oracle的CASE只能返回数值、字符串、日期这类具体数据类型,不能直接返回布尔结果,这是触发错误的核心原因。

修正方案

方案一:用逻辑条件组合替代CASE(推荐,更简洁高效)

直接通过逻辑运算符组合条件,完全可以实现你要的逻辑:

SELECT 1 FROM TABLE T, TABLEAAA O
 WHERE T.ID = O.ID
   AND (:P_PIM_DATE1 IS NULL OR :P_PIM_DATE2 IS NULL OR T.F_DATE BETWEEN :P_PIM_DATE1 AND :P_PIM_DATE2)

逻辑说明:仅当两个日期参数都不为空时,才校验T.F_DATE是否在参数范围内;若任意一个参数为空,该条件自动成立(可根据实际需求调整逻辑)。

方案二:修正CASE语句写法

如果一定要用CASE,需调整为返回可用于判断的数值:

SELECT 1 FROM TABLE T, TABLEAAA O
 WHERE T.ID = O.ID
   AND CASE 
         WHEN :P_PIM_DATE1 IS NOT NULL AND :P_PIM_DATE2 IS NOT NULL THEN 
           CASE WHEN T.F_DATE BETWEEN :P_PIM_DATE1 AND :P_PIM_DATE2 THEN 1 ELSE 0 END
         ELSE 1
       END = 1

通过内层CASE判断日期范围并返回1/0,外层CASE处理参数为空的场景,最后通过判断结果等于1来满足条件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 18:43:15