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