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.START
和seg.END
有日期时间类型 -
[DaysBeforClass]
和[DaysAfterClass]
是参数向最终用户(文本框)
我需要的是,用户同时使用两个参数,并单独使用。
目前,这个WHERE子句效果很好,当:
- 用户使用这两个参数同时
- 用户只使用DaysBeforClass参数
任何想法?
感谢您的帮助!
也许您正在寻找这样的条件:
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
)
)
我假设问题更多地涉及“如果'DaysBeforClass'和/或'DaysAfterClass'为NULL,如何处理它?” –
@WernfriedDomscheit我刚刚更新。 – MT0
您是否为用户传递'NULL'而不输入任何内容? –