Sql Oracle:如果不等于null,则选择日期小于的位置

Sql Oracle:如果不等于null,则选择日期小于的位置,sql,oracle,Sql,Oracle,我有一个记录表,当记录处于活动状态时,一列保存该值。 大多数记录仍处于打开状态,因此在end\u date列中没有任何值 我想选择所有仍处于活动状态的记录。实现这一目标的一种方法(从我的头顶): 但这感觉不对。有没有更好的方法来实现我的目标 编辑:顺便说一句,表格不是很大,也不会增长:) 不会使用“正常”的、非基于函数的索引,因此可能会影响性能 你可以这样问 select * from table t where t.end_date > sysdate OR t.end_date

我有一个记录表,当记录处于活动状态时,一列保存该值。 大多数记录仍处于打开状态,因此在
end\u date
列中没有任何值

我想选择所有仍处于活动状态的记录。实现这一目标的一种方法(从我的头顶):

但这感觉不对。有没有更好的方法来实现我的目标

编辑:顺便说一句,表格不是很大,也不会增长:)

不会使用“正常”的、非基于函数的索引,因此可能会影响性能

你可以这样问

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

相反,这是常用的。。。此外,您甚至可以使用
nvl()
表达式创建一个基于函数的索引,以提高速度。(如果且仅当您需要该优化时)这是不对的,因为是“MM DD yyyy”。应为“yyyy-mon-dd”。:)@Florin Ghita-*我的头顶。如何:选择。。。当end_date为NULL时,我在这里看到了一个2099年的错误……但是在第二种情况下,如果时间流逝,它仍然可能会受到索引不覆盖NULL值的影响,并且那里会有越来越多的闭合值,使得完整表扫描的成本更高。。。(但再看一遍,这可能算是过早的优化)谢谢。。完全忘记了“或”的可能性..:o) 你完全正确@ppeterka。。我认为只有很少的优化是不成熟的。如果此列是索引中使用的唯一列,则很可能导致表扫描。我对自己的经验有偏见,因为大多数时候在筛选日期时,我也有其他约束,这些约束是索引的一部分,所以一些空值不会影响索引的使用。谢谢你的提示,让我明白!
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