次のクエリを実行すると:
select top 5 * from BI_Completes (nolock)where IPAddress <> NULL
0 の結果が得られます。
しかし、私がそれを実行すると
select top 5 * from BI_Completes (nolock)where IPAddress <> 'NULL'
その後、期待どおりに動作します..
これらの違いは何ですか?
次のクエリを実行すると:
select top 5 * from BI_Completes (nolock)where IPAddress <> NULL
0 の結果が得られます。
しかし、私がそれを実行すると
select top 5 * from BI_Completes (nolock)where IPAddress <> 'NULL'
その後、期待どおりに動作します..
これらの違いは何ですか?
NULL は比較できないため、比較演算子を NULL と一緒に使用することはできません。
代わりに IS 演算子を使用する必要があります。
select top 5 *
from BI_Completes (nolock)
where IPAddress IS NOT NULL
2 番目のステートメントは、IPAddress が文字シーケンス 'NULL' と等しくない場所をチェックします。
最初のスニペットは正しくありません。NULL <> NULL は常に false です。これは、定義上 NULL がそれ自体と等しくならないためです。NULL がそれ自体と等しいかどうかを知ることはできないため、比較は事実上false です。2 番目のスニペットは、たまたまどのデータとも一致しない文字列リテラルを使用しています。
使用する正しいコードは次のようになります。
select top 5 * from BI_Completes (nolock)where IPAddress IS NOT NULL
との比較について説明しているこのNULL
MSDN の記事をご覧ください。
あなたの状況では、 の結果が得られているように見えます。そのため、UNKNOWN
何も返されていません。にANSI_NULLS
設定した可能性があります。ON
これにより、値UNKNOWN
が返されます。また、2 番目の例で比較している「NULL」は、文字列比較です。
NULL を処理する適切な方法に関する Andrea または Joel の回答は正しいです (IS NOT NULL
等しいかどうかをチェックする代わりに使用します)。