2017-05-01 6 views
1

を返さないのはなぜ私はテーブルを次ています
My Table
そして単純なクエリ次NOT IN(NULL)は常に何も

SELECT * FROM dbo.Calendars WHERE calname NOT IN(NULL) 

私の質問は、なぜいつもNOT IN(NULL)は何も返さないされますか?
PSは:どんなにあなたがを追加する場合は、あなたのテーブルで何NOT IN(NULL)任意の列の条件に、結果は何もありません。 ありがとうございます。

+1

トライcalnameがnullでない – Sachu

+0

は@Sachu .Thatがme.butのために働く私はNOT INの背後にあるシナリオを探していますと、なぜこれが動作しませんありがとうこのように –

+0

Nullは未知の値であり、したがって、他のヌルを含め、すべての値も同様である。したがって、 'null = null'はfalseであり、' null <> null'もfalseです。 –

答えて

7

calnameのみ正の整数値を取ることができれば例えば、我々は代わりにこれを行うことができます。 チェックThis post on bad practicesINNULLを使用しないでください。EXISTSを使用して、何かが存在する行を少なくとも1つテストしてください。

3

NULLほとんどのデータベースでは、他の値とは扱いが異なります。例えば、この述語は真ではありません:

WHERE foo = NULL 

fooの値が実際にNULLであれば、この述語が真であるのに対し:

WHERE foo IS NULL 

あなたの問題のため、あなただけしたい場合calnameがヌルでないかどうかを確認するには、次の述語を使用します。

WHERE calname IS NOT NULL 

一方、NULLの値のセット([1,2,3,4、NULL]など)のうちの1つの値のセットがあり、まだNOT INの構文を使用する場合は、それこのような:

WHERE calname IS NOT NULL AND calname NOT IN(1, 2, 3, 4) 

EDIT:あなたはNOT IN構文はCOALESCEにあなたは間違いなくそれに格納されていません知っている値に列calnameで使用するように制約されている場合は、これを行うためのさらなる方法カラム。 value equals NULLが定義されていない、とTrueに評価されることはありませんので

WHERE COALESCE(calname, -1) NOT IN (-1) 
3

クエリが評価されて、<> nullと評価され、結果はUNKNOWNになります。

これにクエリを変更し

SELECT * FROM dbo.Calendars WHERE calname IS NOT NULL;