0

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

4 に答える 4

7

2 つのCASE表現形式を混同しています。簡単な式があります (式が等しいかどうかを比較したいだけの場合):

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

そして、個別の述語を評価する検索CASE式があります。

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

検索されたの場合、最初の と のCASE間に式を指定しません。CASEWHEN

于 2013-07-25T07:10:41.073 に答える
3

Damien_The_Unbeliever は大文字と小文字のスタイルを混在させることについては正しいですが、サブクエリもまったく必要ありません。また、サブクエリは 2 つの列を取得しているため、単一の値と比較することはできません。これを行うことができます:

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

これにより、暗黙的な変換に依存するのではなく、2 つの日付間の比較が行われます。私も使用しましたHH24; を使用HHすると、正午から午後 6 時までの時間が、真夜中から午前 6 時までの時間と同じように扱われます。

于 2013-07-25T07:23:02.580 に答える
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
  )

考えられる間違いは 2 つあります。1 つはas ではCASE WHENないことを期待していること、もう 1 つは別名として使用できないことです。CASE sysdate WHENsysdate

于 2013-07-25T07:09:56.583 に答える