【问题标题】:Oracle case missing keywordOracle case 缺少关键字
【发布时间】:2020-02-08 05:38:13
【问题描述】:

当我尝试执行以下查询时,我无法弄清楚缺少什么关键字,我想要的是如果 startDate 和 endDate 存在,则在 else 返回 sysdate-7 数据之间使用。

    select * from LARGE_RELATION LR where
     (CASE WHEN (STARTDATE IS NOT NULL AND ENDDATE IS NOT NULL)
           THEN LR.END_DT BETWEEN to_date(STARTDATE, 'yyyymmdd') and to_date(ENDDATE, 'yyyymmdd')
           ELSE (LR.END_DT IS NULL OR LR.END_DT > SYSDATE - 7)
           END);

ORA-00905: 缺少关键字 00905. 00000 - “缺少关键字” *原因:
*操作:行错误:3 列:31

【问题讨论】:

  • CASE 是一个语句,返回一个值而不是一个条件
  • 您发布的是一个 PL/SQL 代码块。您不能在 PL/SQL 中使用 SQL SELECT 语句。您可以使用的是 SELECT ... INTO ... 但您没有尝试使用它 - 您没有声明变量来接受 SELECT 返回的值。真的不清楚您要做什么,但该错误与 PL/SQL 代码中对 SELECT 的这种无效使用有关。顺便说一句,错误消息指向 SELECT 语句的开头,而不是 CASE 事物(位于不同的代码行)。

标签: sql oracle date case between


【解决方案1】:

两个日期都不为空时的第一个条件句柄

当日期之一为空时,第二个验证

select * 
from LARGE_RELATION LR 
where
    (    STARTDATE IS NOT NULL 
     AND ENDDATE IS NOT NULL
     AND LR.END_DT BETWEEN to_date(STARTDATE, 'yyyymmdd') 
                       AND to_date(ENDDATE, 'yyyymmdd')
    ) OR
    (     (STARTDATE IS NULL OR ENDDATE IS NULL)
      AND (LR.END_DT IS NULL OR LR.END_DT > SYSDATE - 7)
    ) 

【讨论】:

    【解决方案2】:

    case后面需要指定要检查的参数 在你的例子中 - CASE STARTDATE WHEN IS NOT NULL AND (ENDDATE IS NOT NULL)

    【讨论】:

      猜你喜欢
      • 2018-01-12
      • 2020-01-27
      • 2013-02-28
      • 2015-04-17
      • 2012-09-26
      • 2016-11-09
      • 1970-01-01
      • 2018-02-24
      • 2021-01-20
      相关资源
      最近更新 更多