【问题标题】:ORA-00905: missing keywordORA-00905: 缺少关键字
【发布时间】:2012-07-26 09:51:41
【问题描述】:

尝试在 Oracle 中运行以下查询时出现ORA-00905: missing keyword 错误:

select distinct MONTH_ID
from    DSS_MAIN.DIM_TIME a1
where   Case When TO_CHAR(SYSDATE,'MM') < 3
Then TO_CHAR(a1.MONTH_START_DATE,'YYYYMM') Between (TO_CHAR(SYSDATE,'YYYY')-1)||'03' And TO_CHAR(SYSDATE,'YYYYMM')
Else TO_CHAR(a1.MONTH_START_DATE,'YYYYMM') Between TO_CHAR(SYSDATE,'YYYY')||'03' And TO_CHAR(SYSDATE,'YYYYMM')
End;

各个Between 子句工作正常,所以我假设Case 语法有问题。

有什么想法吗?

【问题讨论】:

  • case 语句中的TO_CHAR(a1.MONTH_START_DATE,'YYYYMM') Between (TO_CHAR(SYSDATE,'YYYY')-1)||'03' And TO_CHAR(SYSDATE,'YYYYMM') 没有意义。你想检索什么(你能用英语解释一下)吗?
  • 另外,表达式TO_CHAR(SYSDATE,'YYYY')-1 也没有任何意义。为什么要从 string 中减去 1?
  • @a_horse_with_no_name: 同意...但我猜 Oracle 的隐式转换规则只是将其转换为数字(例如 select to_char(sysdate,'YYYY') -1 from dual; -> 2011
  • 我正在尝试获取从 3 月到 2 月的一年的年初至今月份的列表。例如,如果 SYSDATE 为 2012 年 6 月,则应返回 2012 年 3 月 - 2012 年 6 月。如果 SYSDATE 为 2013 年 2 月,则应返回 2012 年 3 月 - 2013 年 2 月
  • @EvanMPW 如果答案有效,你能接受吗?

标签: sql oracle case ora-00905


【解决方案1】:

试试这个:

SELECT DISTINCT MONTH_ID
  FROM DSS_MAIN.DIM_TIME A1
 WHERE TO_CHAR(A1.MONTH_START_DATE, 'YYYYMM') 
            BETWEEN CASE
                        WHEN TO_CHAR(SYSDATE, 'MM') < '03' THEN
                            (TO_NUMBER(TO_CHAR(SYSDATE, 'YYYY')) - 1) || '03'
                        ELSE
                            TO_CHAR(SYSDATE, 'YYYY') || '03'
                    END
                AND  TO_CHAR(SYSDATE, 'YYYYMM')

Case 返回一个值以供进一步使用,它不会以您使用它的方式有用。

【讨论】:

  • @hmmftg:只有 EvanMPW 可以做到这一点。 ...如果对他有用,他应该这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-02
  • 2019-01-18
  • 1970-01-01
  • 2018-06-18
  • 2016-03-12
  • 1970-01-01
相关资源
最近更新 更多