2012-02-09 64 views
0

我需要檢查一個值是否在一個範圍內,但我不能保證該範圍的任何一端不是NULL。這種情況下的值是整數。 「mo」表示就業只是sql布爾條件

目前我有以下

WHERE (r.year BETWEEN mo.startyear AND mo.endyear >= r.year) 
OR (mo.startyear <= r.year AND mo.endyear IS null) 
OR (mo.startyear IS null AND mo.endyear IS null) 
OR (mo.startyear IS null AND mo.endyear >= r.year) 

這是在某一年檢查mo是「使用」的唯一途徑(r

+0

對不起,我應該有規定,這個需要是ANSI SQL。也許這是不可能的,更簡單 – AlasdairC 2012-02-09 04:37:50

回答

0

如何:

WHERE (mo.startyear <= r.year OR mo.startyear IS NULL) 
    AND (mo.endyear >= r.year OR mo.endyear IS NULL) 
+0

完美,如果不是早上4點,我可能沒有你的幫助就到了這裏,但非常感謝! – AlasdairC 2012-02-09 04:53:23

0

設置的默認值NULL。如果您使用的是Oracle則是這樣的:

WHERE r.year 
BETWEEN nvl(mo.startyear,to_date('01/01/1990','dd/mm/yyyy')) 
AND nvl(mo.endyear,to_date('31/12/4701','dd/mm/yyyy')) 
0
WHERE r.year BETWEEN(COALESCE(mo.startyear,-9999) AND COALESCE(mo.endyear,9999)) 

COALESCE首先嚐試的第一個參數,如果它爲null,去爲下一個。所以,除非你的年數少於-9999或超過9999,否則這將起作用。否則,增加這些號碼:)這也是ANSI標準

PS:這確實很髒,但它是最緊湊的形式,我能想到的

+0

這是很好的知道,但@eaolson的答案是cuter :) – AlasdairC 2012-02-09 04:54:15

+1

哈哈,我完全同意:) – 2012-02-09 04:55:32