【问题标题】:SQL - Use OR operator in parameterSQL - 在参数中使用 OR 运算符
【发布时间】:2017-10-19 14:04:07
【问题描述】:

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

有什么想法吗?

感谢您的帮助!

【问题讨论】:

  • 您是否通过NULL 让用户未输入任何内容?

标签: sql oracle parameters or-operator


【解决方案1】:

如果您使用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
         )
      )

【讨论】:

  • 我认为这个问题与“如果DaysBeforClass 和/或DaysAfterClass 为NULL,如何处理?”
  • @WernfriedDomscheit 我刚刚更新。
【解决方案2】:

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

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) 上使用基于函数的索引

【讨论】:

    猜你喜欢
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    相关资源
    最近更新 更多