SQL - 在参数中使用OR运算符

时间:2017-10-19 14:04:07

标签: sql oracle parameters or-operator

我正在使用Oracle 11g,并且我在WHERE子句中使用参数进行了简单的查询(报告),但我无法有效地使用OR操作。

我的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参数

有什么想法吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分: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)上使用基于函数的索引

答案 1 :(得分: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
         )
      )