Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 神谕使用case语句时缺少关键字。错误00905_Sql_Oracle - Fatal编程技术网

Sql 神谕使用case语句时缺少关键字。错误00905

Sql 神谕使用case语句时缺少关键字。错误00905,sql,oracle,Sql,Oracle,自从我引入CASE语句以来,我一直在下面的语句中得到一个错误“ORA-00905:missing keyword”,但我无法找出缺少什么 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 SYSDAT

自从我引入CASE语句以来,我一直在下面的语句中得到一个错误“ORA-00905:missing keyword”,但我无法找出缺少什么

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
  )
尝试


有两个可能的错误,一个是它应该是CASE WHEN而不是CASE sysdate WHEN,第二个是sysdate as alias,它不能用作别名。

您混淆了CASE表达式的两种形式。当您只想比较表达式是否相等时,有一个简单的表达式:

CASE Expr1
    WHEN Expr2 THEN ...
    WHEN Expr3 THEN ...
    ELSE ...
END
还有一个搜索的CASE表达式,您希望在其中计算单独的谓词:

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

对于已搜索的事例,您不需要在事例和第一个事例之间指定表达式。

Damien_不相信者关于混合事例样式的观点是正确的,但是您也根本不需要子查询,您拥有的子查询是返回两列,这是无法与单个值进行比较的。您可以这样做:

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点之间的时间相同的时间,我很确定这是您无意的。

这会产生太多的值错误…这是因为它返回SYSDATE和MY_SYSDATE,因此无法计算CYCLE_FACT_MAIN.ENDTIME>SYSDATE,MY_SYSDATE吗?我们怎样才能解决这个问题?@RichardMaguire-为什么你希望它比两者都大?下一个子句说它必须是Ok的,只需要返回一个值,或者昨天的日期在06:00:00,如果一天中的当前小时<6,或者今天的日期在06:00:00,那么CASE语句返回的值太多,只需要返回一个值,或者昨天的日期在06:00:00,如果我给出了有效的查询,不是完美的价值!非常感谢Alex!!这让我意识到,THEN和ELSE语句需要转换
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
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