2013-08-22 30 views
1

我有一个记录表,并且一列包含记录变为非活动状态时的值。 大部分记录仍处于打开状态,因此不会在end_date列中保留任何值。Oracle:SELECT如果日期不是零,则等于空

我想选择所有这些仍然有效的记录。一种方法来实现这一点(从我的头顶上):

select * 
from table t 
where nvl(t.end_date, to_date('2099-DEC-31', 'MM-DD-yyyy')) > sysdate 

但它感觉不对。有没有更好的方法来实现我想要的?

编辑:BTW,该表是不是巨大的,是不会成长:)

+0

这是常用的......而且,你甚至可以创建一个'NVL()'表达功能的索引,使之更快。 (如果并且只有当你需要这种优化时) – ppeterka

+1

这是不正确的,因为是'MM-DD-yyyy'。应该是'yyyy-mon-dd'。 :) –

+0

@弗洛林Ghita - *我的头顶。 – hogni89

回答

2
select * 
    from table t 
where nvl(t.end_date, to_date('2099-DEC-31', 'MM-DD-yyyy')) > sysdate 

不会用一个“正常”的,非基于函数的索引,所以它可能会降低性能。

可以查询它像

select * 
    from table t 
where t.end_date > sysdate OR t.end_date is null 

代替

+2

但是在第二种情况下,如果时间流逝,它仍然会受到索引不覆盖NULL值的影响,那里会有越来越多的关闭值,这使得整个桌面扫描成本更高......(但是再读一遍,这可能算是一个不成熟的优化) – ppeterka

+0

谢谢..总是忘记了'或'的可能性..:o) – hogni89

+0

你绝对是对的@ppeterka ..我认为只有很少的优化是不成熟的。 如果此列是索引中唯一使用的列,则很可能会导致表扫描。我偏向于自己的经验,因为大多数情况下,在过滤日期时,我还有其他约束,这些约束也是索引的一部分,所以一些空值不会影响索引使用。感谢提示清楚! – Linky

相关问题