2012-02-09 73 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