0

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) 
4

1 に答える 1

1

式を使用する代わりに、式を使用して両方のオプションを考慮するCASEことができます。OR

SELECT COUNT(*) -- Match for measure value on these keys.
        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 (
                (
                v_measure_map(i).v_date_stamp='Benchmark_Date'
                AND v_xs_scope(j).v_enriched_date BETWEEN NVL(b.effective_start_time, 00000000000000) AND NVL(b.effective_end_time, 99999999999999)
                )
            OR
                (
                v_measure_map(i).v_date_stamp<>'Benchmark_Date'
                AND v_xs_scope(j).v_enriched_time BETWEEN NVL(b.effective_start_time, 00000000000000) AND NVL(b.effective_end_time, 99999999999999) 
                )
            )
        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)
          ) ;  
于 2013-05-09T21:48:16.277 に答える