WHERE 句内で次の CASE ステートメントを実行しようとしていますが、機能しません。どこでも検索しましたが、解決策が見つかりません。エラーレポートには次のように書かれています:
PL/SQL: ORA-00905: missing keyword.
抜けているキーワードは?
SELECT COUNT(*)
INTO v_sql_count
FROM xaction_level_info b
WHERE v_measure_map(i).v_upload_code = b.UPLOAD_CODE
AND v_xs_scope(j).v_scope_key = b.SCOPE
AND
CASE WHEN
v_measure_map(i).v_date_stamp='Benchmark_Date' THEN
v_xs_scope(j).v_enriched_date BETWEEN NVL(b.effective_start_time, 00000000000000) AND NVL(b.effective_end_time, 99999999999999)
ELSE
v_xs_scope(j).v_enriched_time BETWEEN NVL(b.effective_start_time, 00000000000000) AND NVL(b.effective_end_time, 99999999999999)
END
AND b.level_order =
(SELECT MIN(level_order)
FROM xaction_level_info
WHERE SCOPE = b.SCOPE
AND UPLOAD_CODE = b.UPLOAD_CODE
AND NVL(effective_start_time, 00000000000000) = NVL(b.effective_start_time, 00000000000000)
AND NVL(effective_end_time, 99999999999999) = NVL(b.effective_end_time, 99999999999999)
) ;
この方法を試しましたが、希望する結果が得られません。誰かが理由を説明できますか?Enriched_Date が date_stamp フィールドにあるかどうかに関係なく、Oracle は v_xs_scope(j).v_enriched_time のみを使用しているようです。
CASE WHEN
v_measure_map(i).v_date_stamp='Enriched_Date' THEN
v_xs_scope(j).v_enriched_date
when
v_measure_map(i).v_date_stamp='Benchmark_Date' THEN
v_xs_scope(j).v_benchmark_date
ELSE
v_xs_scope(j).v_enriched_time
END
BETWEEN NVL(b.effective_start_time, 00000000000000) AND NVL(b.effective_end_time, 99999999999999)