2017-10-19 50 views
0

中使用OR運算符我正在使用Oracle 11g,並且在我的WHERE子句中使用了一個簡單的查詢(報告)參數,但我無法高效地使用OR操作。SQL - 在參數

我的WHERE子句:

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]是參數向最終用戶(文本框)

我需要的是,用戶同時使用兩個參數,並單獨使用。

目前,這個WHERE子句效果很好,當:

  • 用戶使用這兩個參數同時
  • 用戶只使用DaysBeforClass參數

任何想法?

感謝您的幫助!

+1

您是否爲用戶傳遞'NULL'而不輸入任何內容? –

回答

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]因爲這時如果使用TRUNC(column_name)那麼Oracle不能甲骨文可以利用上TRUNC(seg.START)

0

一個基於函數的索引使用該列上的索引(並且必須具有基於函數的索引)。或者,您可以使用:

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