2011-10-21 13 views
0

2つのSQLクエリの結果が混乱します。テーブルの内容と2つのクエリを与える:(A)の"Null"を含むSQLクエリに混乱があります。選択された行が返されません。

​​

a) SELECT Col1, STATUS FROM TABLE_A WHERE KEY IN ('abcd','defg');

b) SELECT Col1, STATUS FROM TABLE_A WHERE KEY IN ('abcd','defg') and NOT (STATUS = 'PENDING')

結果は、すべての4行を示し、(B)の結果は何も示していません!

列 'ステータス'には 'PENDING'以外の値を設定できます。理由を報告するために、 'STATUS IS NOT NULL'をフィルタとして使用できません。私は質問(b)が何も返さない理由を理解できません。おかげで事前に任意の助け

プラットフォーム:MSSQL 2008

答えて

2

SQLは3つの値論理(TrueFalseUnknown)を使用しています。 WHERE句は、返される行についてはTrueと評価する必要があります。

STATUS = 'PENDING'は、Status IS NULLのときにUNKNOWNを返します。

Unknownを無効にすると、まだUnknownになります。

あなたは

SELECT Col1, STATUS 
FROM TABLE_A 
WHERE KEY IN ('abcd','defg') and (STATUS IS NULL OR STATUS <> 'PENDING') 

としてクエリを書き直す必要がありますSQL and the Snare of Three-Valued Logic

を参照してください(あなたが望む動作を取得するために非推奨ANSI_NULLSセッションオプションを使用することも可能ですが)

+0

+1が、 OPがある理由か他の理由で 'STATUS IS NOT NULL'を使用しているように見えないので、条件を' AND NOT ISNULL(STATUS、 '')= 'PENDING''に変更するかもしれません。 –

+0

@Lieven - OPがそのrestriをなぜ追加したのか分からない質問に答えてください。彼らが照会を全く変更できない場合は、 'ANSI_NULLS'を見ることができます。 –

+0

彼らは...しかし、私はそれを維持したくないでしょう:) –

関連する問題