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

と考えることができる最もコンパクトな形です。たぶん、これ以上簡単にこれを行うことはできません – AlasdairC

答えて

0

方法について:

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

パーフェクト、それが午前4時でなければ私はあなたの助けなしにここにいるかもしれませんが、本当に多くのありがとう! – AlasdairC

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です:)これらの数字を増やす:これは確かに汚いですが、それは私は、これはANSI SQLにする必要があると規定している必要があり、私は申し訳ありません

+0

これは知っておいてよかったですが、@eaolsonの答えはかわいいです:) – AlasdairC

+1

母、私はまったく同意します:) –