2013-08-22 66 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

相關問題