甲骨文。使用case语句时缺少关键字。错误00905

时间:2013-07-25 07:00:31

标签: sql oracle

自从我介绍CASE语句以来,我一直收到错误'ORA-00905:缺少关键字'以及以下语句,但我无法弄清楚缺少什么。

SELECT
    CYCLE_S_FACT_MAIN.STARTTIME,
    CYCLE_S_FACT_MAIN.ENDTIME
FROM
  CYCLE_S_FACT_MAIN
WHERE
  (
   CYCLE_S_FACT_MAIN.ENDTIME  > 
    (SELECT SYSDATE,
        CASE SYSDATE
            WHEN TO_CHAR(SYSDATE, 'HH') < 6 THEN CONCAT(TO_CHAR(SYSDATE, 'DD-MM-YYYY'), ' 06:00:00')
            ELSE CONCAT(TO_CHAR(SYSDATE - INTERVAL '1' DAY, 'DD-MM-YYYY'), ' 06:00:00')
        END AS SYSDATE
    FROM DUAL
    )
   AND
   CYCLE_S_FACT_MAIN.ENDTIME  <= SYSDATE
  )

4 个答案:

答案 0 :(得分:7)

你正在混淆两种形式的CASE表达式。有一个简单的表达式(当你只是想比较表达式的相等性时):

CASE Expr1
    WHEN Expr2 THEN ...
    WHEN Expr3 THEN ...
    ELSE ...
END

还有一个搜索过的CASE表达式,您需要在其中评估单独的谓词:

CASE
    WHEN Predicate1 THEN ...
    WHEN Predicate2 THEN ...
    ELSE ...
END

对于搜索到的CASE,您不需要在CASE和第一个WHEN之间指定表达式。

答案 1 :(得分:3)

Damien_The_Unbeliever关于混合大小写样式是正确的,但你根本不需要子查询,而你所拥有的那个正在返回两列 - 你无法与单个值进行比较。你可以这样做:

WHERE
   CYCLE_S_FACT_MAIN.ENDTIME > CASE
        WHEN TO_NUMBER(TO_CHAR(SYSDATE, 'HH24')) < 6
          THEN TRUNC(SYSDATE) + INTERVAL '6' HOUR
        ELSE TRUNC(SYSDATE) - INTERVAL '1' DAY + INTERVAL '6' HOUR END
   AND CYCLE_S_FACT_MAIN.ENDTIME  <= SYSDATE

这使得比较在两个日期之间,而不是依赖于implcit转换。我也用HH24;使用HH将在午间和下午6点之间处理与午夜和早上6点之间相同的时间,我很确定你不打算这样做。

答案 2 :(得分:0)

尝试

SELECT
    CYCLE_S_FACT_MAIN.STARTTIME,
    CYCLE_S_FACT_MAIN.ENDTIME
FROM
  CYCLE_S_FACT_MAIN
WHERE
  (
   CYCLE_S_FACT_MAIN.ENDTIME  > 
    (SELECT SYSDATE,
        CASE 
            WHEN TO_CHAR(SYSDATE, 'HH') < 6 THEN CONCAT(TO_CHAR(SYSDATE, 'DD-MM-YYYY'), ' 06:00:00')
            ELSE CONCAT(TO_CHAR(SYSDATE - INTERVAL '1' DAY, 'DD-MM-YYYY'), ' 06:00:00')
        END AS "MY_SYSDATE"
    FROM DUAL
    )
   AND
   CYCLE_S_FACT_MAIN.ENDTIME  <= SYSDATE
  )

有两个可能的错误,一个是期望CASE WHEN不是CASE sysdate WHEN,第二个是sysdate作为别名,不能用作别名。

答案 3 :(得分:0)

SELECT TO_CHAR(SYSDATE,'HH'),
     CASE
          WHEN TO_CHAR(SYSDATE,'HH') < 6
          THEN CONCAT(TO_CHAR(SYSDATE, 'DD-MM-YYYY'), ' 06:00:00')
          ELSE CONCAT(TO_CHAR(SYSDATE - INTERVAL '1' DAY, 'DD-MM-YYYY'), ' 06:00:00')
     END "sysdate" ,
     TO_CHAR(SYSDATE, 'HH'),
     CONCAT(TO_CHAR(SYSDATE, 'DD-MM-YYYY'), ' 06:00:00')
FROM dual;

12  24-07-2013 06:00:00 12  25-07-2013 06:00:00