我得到ORA-00905:缺少关键字,在我的时间语句的情况下。下面是查询。
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 ';发布于 2020-04-29 19:52:26
不能将布尔值作为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*/(我留下了这个案例作为注释,向您展示了编辑的内容)
发布于 2020-04-29 19:51:44
这太长了,不能发表评论。
您使用的是case表达式,而不是case语句。这不仅仅是一个更糟的区别。SQL中的表达式(通常)是特定类型的标量值,例如数字、字符串或日期。
Oracle没有boolean数据类型。因此,不能将布尔表达式的结果赋值给变量。也不能从case表达式返回它。但你的逻辑正试图做到这一点。
通常,不鼓励将case表达式放入SQL中,因为它们会阻碍优化器。在你的情况下,你不需要。外部逻辑应该在SQL字符串之外分配方法比较逻辑。然后,一个为真的条件应该进入SQL表达式。不这样做的唯一原因是如果您将SQL字符串存储在某个地方,那么它将在不同的时间运行。
https://stackoverflow.com/questions/61510416
复制相似问题