我有以下数据:
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
哪个不行。
非常感谢你的帮助。
答案 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