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

