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

ORA-00908缺失关键字错误:PL/SQL Developer中SQL语句求助

ORA-00908错误排查及解决

错误原因

Oracle的CASE表达式不支持直接返回布尔逻辑表达式(比如原语句中A.C07FECHADE >= ... AND A.C07FECHADE <= ...这种组合条件)。WHERE子句要求的是布尔结果,但CASE在这里必须返回单一值(日期、数字等)后再做比较,原写法违反了语法规则,因此触发ORA-00908错误。

解决方案

方案1:拆分条件为AND/OR组合逻辑

直接把CASE的分支逻辑拆成两个独立的条件块,用OR连接,逻辑更直观:

SELECT COUNT(0) AS CANT, 
       C.C06NOMBRE AS CONSOLIDADORA
FROM T07OBLIGACION A
JOIN T06EMPRESA B ON A.C07EMPRESA = B.C06IDEMPRESA AND A.C07CODSUCURSAL = B.C06CODSUCURSAL
JOIN T06EMPRESA C ON C.C06IDEMPRESA = B.C06IDPAGCON AND C.C06CODSUCURSAL = B.C06SUCURSALCON
WHERE 
  (B.C06FECHACOR <= SYSDATE 
   AND A.C07FECHADE >= ADD_MONTHS(B.C06FECHACOR, -2) 
   AND A.C07FECHADE <= ADD_MONTHS(B.C06FECHACOR, -1) - 1)
  OR
  (B.C06FECHACOR > SYSDATE 
   AND A.C07FECHADE >= ADD_MONTHS(B.C06FECHACOR, -1) 
   AND A.C07FECHADE <= B.C06FECHACOR - 1)
GROUP BY C.C06NOMBRE

方案2:调整CASE返回值,配合BETWEEN使用

让CASE分别返回日期范围的上下限,再用BETWEEN做范围判断:

SELECT COUNT(0) AS CANT, 
       C.C06NOMBRE AS CONSOLIDADORA
FROM T07OBLIGACION A
JOIN T06EMPRESA B ON A.C07EMPRESA = B.C06IDEMPRESA AND A.C07CODSUCURSAL = B.C06CODSUCURSAL
JOIN T06EMPRESA C ON C.C06IDEMPRESA = B.C06IDPAGCON AND C.C06CODSUCURSAL = B.C06SUCURSALCON
WHERE 
  A.C07FECHADE BETWEEN 
    CASE WHEN B.C06FECHACOR <= SYSDATE THEN ADD_MONTHS(B.C06FECHACOR, -2) ELSE ADD_MONTHS(B.C06FECHACOR, -1) END
    AND
    CASE WHEN B.C06FECHACOR <= SYSDATE THEN ADD_MONTHS(B.C06FECHACOR, -1) - 1 ELSE B.C06FECHACOR - 1 END
GROUP BY C.C06NOMBRE

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 08:03:30