2017-10-19 19 views
0

Oracle 11gを使用していますが、WHERE句のパラメータを使用して簡単なクエリ(レポート)を使用していますが、OR演算を効率的に使用できません。SQL - パラメータでOR演算子を使用

句があるマイ:

WHERE 
1=1 
AND 
(
    TRUNC(SYSDATE) - TRUNC(seg.START) BETWEEN 0 AND [DaysBeforClass] 
    OR 
    TRUNC(seg.END) - TRUNC(SYSDATE) BETWEEN 0 AND [DaysAfterClass] 
) 


してください、次の点に注意してください

  • seg.STARTseg.ENDは、日付時刻型の
  • [DaysBeforClass][DaysAfterClass]ですが、エンドユーザーへのパラメータです(テキストボックス)

私が必要とするのは、ユーザーが両方のパラメータを同時に使用することです。

  • ユーザーが同時に両方のパラメータを使用しています
  • ユーザーのみDaysBeforClassパラメータ

任意のアイデア使用しています:とき

現在は、このWHERE句はうまく機能しますか?

ありがとうございました!

+1

ユーザーには何も入力されていません。 –

答えて

0

はたぶん、あなたはこのような条件を探しています:

WHERE 
    ([DaysBeforClass] IS NULL OR TRUNC(seg.START) BETWEEN TRUNC(SYSDATE) - [DaysBeforClass] AND TRUNC(SYSDATE)) 
    AND 
    ([DaysAfterClass] IS NULL OR TRUNC(seg.END) BETWEEN TRUNC(SYSDATE) AND TRUNC(SYSDATE) + [DaysAfterClass]) 

私はTRUNC(seg.START) BETWEEN TRUNC(SYSDATE) - [DaysBeforClass] AND TRUNC(SYSDATE)の代わりTRUNC(SYSDATE) - TRUNC(seg.START) BETWEEN 0 AND [DaysBeforClass]を使用し、OracleがTRUNC(seg.START)

0

にファンクション索引を利用することができますので、あなたがTRUNC(column_name)を使用する場合、Oracleはできませんその列の索引を使用します(関数ベースの索引を代わりに使用する必要があります)。または、次のように使用することもできます。

WHERE ( :DaysBeforClass IS NULL 
     OR ( seg.START >= TRUNC(SYSDATE) - :DaysBeforClass 
     AND seg.START < TRUNC(SYSDATE) + 1 
     ) 
    ) 
AND ( :DaysAfterClass IS NULL 
     OR ( seg.END >= TRUNC(SYSDATE) 
     AND seg.END < TRUNC(SYSDATE) + :DaysAfterClass + 1 
     ) 
    ) 
+0

私は、「DaysBeforClass」や「DaysAfterClass」がNULLの場合に、「どう対処するの? –

+0

@WernfriedDomscheit私はちょうどそれを更新していた。 – MT0