我正在使用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子句适用于:
有什么想法吗?
感谢您的帮助!
答案 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
)
)