首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ORA-00905: case语句中缺少关键字

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

Stack Overflow用户
提问于 2020-04-29 19:47:15
回答 2查看 219关注 0票数 0

我得到ORA-00905:缺少关键字,在我的时间语句的情况下。下面是查询。

代码语言:javascript
复制
  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 ';
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-29 19:52:26

不能将布尔值作为oracle查询中的可选内容,只能在WHERE/ON子句等中生成布尔表达式

也就是说,这是无效的:

代码语言:javascript
复制
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

这是有效的:

代码语言:javascript
复制
select case when 1=1 then 'TRUE' else 'FALSE' end from dual

稍后,您可以将这些值与实现布尔值的值进行比较:

代码语言:javascript
复制
WHERE CASE WHEN x=y THEN 'T' ELSE 'F' END = 'T'

但你不能独自使用布尔人..。这也是无效的:

代码语言:javascript
复制
WHERE CASE WHEN x=y THEN 1=1 ELSE 1=0 END

在您的例子中,将案例试图实现的布尔人推广到WHERE谓词中:

代码语言:javascript
复制
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*/

(我留下了这个案例作为注释,向您展示了编辑的内容)

票数 1
EN

Stack Overflow用户

发布于 2020-04-29 19:51:44

这太长了,不能发表评论。

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

Oracle没有boolean数据类型。因此,不能将布尔表达式的结果赋值给变量。也不能从case表达式返回它。但你的逻辑正试图做到这一点。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61510416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档