0

次のクエリを実行すると:

select top 5 * from  BI_Completes (nolock)where IPAddress <> NULL

0 の結果が得られます。

しかし、私がそれを実行すると

select top 5 * from  BI_Completes (nolock)where IPAddress <> 'NULL'

その後、期待どおりに動作します..

これらの違いは何ですか?

4

3 に答える 3

8

NULL は比較できないため、比較演算子を NULL と一緒に使用することはできません。
代わりに IS 演算子を使用する必要があります。

select top 5 * 
from  BI_Completes (nolock)
where IPAddress IS NOT NULL

2 番目のステートメントは、IPAddress が文字シーケンス 'NULL' と等しくない場所をチェックします。

于 2012-08-08T15:56:16.197 に答える
2

最初のスニペットは正しくありません。NULL <> NULL は常に false です。これは、定義上 NULL がそれ自体と等しくならないためです。NULL がそれ自体と等しいかどうかを知ることはできないため、比較は事実上false です。2 番目のスニペットは、たまたまどのデータとも一致しない文字列リテラルを使用しています。

使用する正しいコードは次のようになります。

select top 5 * from  BI_Completes (nolock)where IPAddress IS NOT NULL
于 2012-08-08T15:56:47.570 に答える
2

との比較について説明しているこのNULLMSDN の記事をご覧ください。

あなたの状況では、 の結果が得られているように見えます。そのため、UNKNOWN何も返されていません。にANSI_NULLS設定した可能性があります。ONこれにより、値UNKNOWNが返されます。また、2 番目の例で比較している「NULL」は、文字列比較です。

NULL を処理する適切な方法に関する Andrea または Joel の回答は正しいです (IS NOT NULL等しいかどうかをチェックする代わりに使用します)。

于 2012-08-08T15:57:29.067 に答える