如何在不使用和子句的情况下在Sql查询中使用子句

时间:2015-06-29 07:48:39

标签: sql oracle predicate between

我创建了一个查询,可以获得两个日期之间的结果,它的工作正常。 现在我有一个用户不输入任何日期的场景。在这种情况下 无论日期如何,我都需要从数据库中获取所有结果。 当用户未输入任何日期时,以下查询失败,并返回 空结果集。
请指导我如何解决这个问题。

select * from emp_register
where date between ' 2015-03-26 15:42:52' and ' 2015-03-26 15:42:52' 
or status= 'Y'

日期格式为Timestamp

2 个答案:

答案 0 :(得分:2)

  

“2015-03-26 15:42:52”和“2015-03-26 15:42:52”之间的日期

' 2015-03-26 15:42:52' DATE ,它是字符串。永远不要依赖隐式数据类型转换。您可能很幸运能够根据 NLS 设置获得结果,但是,当客户端NLS设置与其他设置不同时,它肯定会失败。

  

现在我有一个用户没有输入任何日期的情况。在这种情况下,无论日期如何,我都需要从数据库中获取所有结果

无需在 PL / SQL 中执行,在 SQL 中执行此操作。

对值使用 NVL 功能。在NVL的 BETWEEN 子句中使用默认的下限上限日期值。

例如,

SELECT *
FROM emp_register
WHERE DATE BETWEEN NVL(:date1, DATE '1900-01-01') AND NVL(:date2, DATE '9999-01-01')
OR status= 'Y'

因此,只要:date1和/或:date2和/ NULL ,它就会使用默认日期值来从表中获取所有行。

答案 1 :(得分:1)

有几种选择:

  1. 使用Dynamic SQL根据用户输入构建查询
  2. 使用多个IF / ELSE语句根据用户输入构建查询
  3. 设置始终适合您的时间范围的开始日期和结束日期的默认值,例如1900-01-012300-01-01,如果用户没有通过任何内容。