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*/
(我在评论中留下了案例,以向您展示编辑的内容)
我收到 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*/
(我在评论中留下了案例,以向您展示编辑的内容)