SQL - 在参数

问题描述:

中使用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'而不输入任何内容? –

也许您正在寻找这样的条件:

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)

一个基于函数的索引使用该列上的索引(并且必须具有基于函数的索引)。或者,您可以使用:

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