0

我正在使用 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.START并且seg.END是日期时间类型
  • [DaysBeforClass]并且[DaysAfterClass]是最终用户的参数(文本框)

我需要的是用户同时和单独使用这两个参数。

目前,此 WHERE 子句适用于以下情况:

  • 用户同时使用这两个参数
  • 用户仅使用 DaysBeforClass 参数

有任何想法吗?

感谢帮助!

4

2 回答 2

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)

于 2017-10-19T14:27:19.077 回答
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
         )
      )
于 2017-10-19T14:27:38.080 回答