Oracle SQL在where子句中包含空日期

时间:2014-03-17 17:21:43

标签: sql oracle

我有以下数据:

id | actual_start
 1 | (null)
 2 | 03/03/2014
 3 | 27/03/2014

我希望能够使用一个使用输入,它将选择包括日期输入和日期输入之后的所有日期,但是空值导致我出现问题。如果用户将输入留空,我只想要包含空值。

这就是我所拥有的:

where actual_start >= nvl(to_date('&start_date','dd/mm/yyyy'), to_date('01/01/2000', 'dd/mm/yyyy'))

这适用于用户确实输入日期的情况。但是,如果用户将其留空,那么我得到这个:

id | actual_start
 2 | 03/03/2014
 3 | 27/03/2014

这不好。

我的另一个想法是尝试:

where (actual_start >= nvl(to_date('&start_date','dd/mm/yyyy'), to_date('01/01/2000', 'dd/mm/yyyy'))
or actual_start is null)

但是这总是包含空值 - 即它适用于没有输入任何内容的用户,但如果用户输入3月20日,则返回:

id | actual_start
 1 | (null)
 3 | 27/03/2014

哪个不行。

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

试试这个:

where nvl(actual_start, to_date('01/01/2000', 'dd/mm/yyyy')) >=
 nvl(to_date('&start_date','dd/mm/yyyy'), to_date('01/01/2000', 'dd/mm/yyyy'))

虽然不能使用actual_date列的索引会产生副作用,但可能会导致大型数据集出现性能问题。

更新:您可以使用的另一个是稍微修改的第二个条件:

where actual_start >= 
 nvl(to_date('&start_date','dd/mm/yyyy'), to_date('01/01/2000', 'dd/mm/yyyy'))
or nvl('&start_date',actual_start) is null