ORA-00905: case 语句中缺少关键字

ORA-00905: missing keyword in case statement

我收到 ORA-00905:我的 when 子句中的 case 语句中缺少关键字。下面是查询。

  vsqlstr := 'select name, enrollement_dt,case_name, dept, subject, city, state, zip from enrollement where ';
    vsqlstr :=vsqlstr ||' 
    AND CASE
        WHEN TO_CHAR(SYSDATE,''MM'') <= ''06'' THEN enrollement_dt <= to_date(''12''||(EXTRACT(YEAR FROM SYSDATE)-1), ''MMYYYY'') 
        ELSE enrollement_dt >= to_date(''07''||(EXTRACT(YEAR FROM SYSDATE)), ''MMYYYY'') 
    END ';

评论太长了。

您使用的是 case 表达式,而不是 case 语句。这不仅仅是更糟的区别。 SQL 中的表达式(通常)是特定类型的标量值,例如数字或字符串或日期。

Oracle 没有 boolean 数据类型。因此,您不能将布尔表达式的结果分配给变量。您也不能从 case 表达式中 return 它。但你的逻辑正试图这样做。

一般来说,不鼓励将 case 表达式放在 SQL 中,因为它们会阻碍优化器。在你的情况下,你不需要一个。您的外部逻辑应该将方法比较逻辑 outside 分配给 SQL 字符串。那么一个为真的条件应该进入 SQL 表达式。不这样做的唯一原因是,如果您将 SQL 字符串存储在某处,那么它将在不同时间成为 运行。

您不能在 oracle 的查询中将布尔值作为可选内容,您只能在例如WHERE/ON 子句等

即这是无效的:

select case when 1=1 then 2>3 else 4>5 end from dual
                          ^^^
    can't have something that evaluates to a boolean type here

这是有效的:

select case when 1=1 then 'TRUE' else 'FALSE' end from dual

您稍后可以将这些值与某些东西进行比较以实现布尔值:

WHERE CASE WHEN x=y THEN 'T' ELSE 'F' END = 'T'

但是你不能单独使用布尔值。这也是无效的:

WHERE CASE WHEN x=y THEN 1=1 ELSE 1=0 END

在您的案例中,将案例试图实现的布尔值提升到 WHERE 谓词中:

WHERE (
 /*CASE 
     WHEN*/ TO_CHAR(SYSDATE,''MM'') <= ''06'' /*THEN*/ AND enrollement_dt <= to_date(''12''||(EXTRACT(YEAR FROM SYSDATE)-1), ''MMYYYY'')
  ) OR 
    /*ELSE*/ enrollement_dt >= to_date(''07''||(EXTRACT(YEAR FROM SYSDATE)), ''MMYYYY'') 
/*END*/

(我在评论中留下了案例,以向您展示编辑的内容)