declare @test int
declare @test2 int = 3
select case when @test != @test2 then 1 else 0 end
select case when @test = @test2 then 1 else 0 end
結果は常に0です。誰かがこれを説明できますか?
declare @test int
declare @test2 int = 3
select case when @test != @test2 then 1 else 0 end
select case when @test = @test2 then 1 else 0 end
結果は常に0です。誰かがこれを説明できますか?
@test
まだ値を設定していません。値が設定されているためですNULL
。
@test
@test2
との比較NULL
は偽になるため、が等しくなったり等しくなったりすることはありません。
この動作は、ANSI_NULLSセットオプションによって制御されます。実際、ANSI_NULLSをOFFに設定すると、最初の選択で1が得られます。
NULLは特別な値であり、不明な値です。あなたはこのようにあなたの質問を読むことができます:
不明な値が3に等しくない場合は、値を選択します。不明な値が3に等しい場合は、値を選択します。
値が不明であるため、一致する場合と一致しない場合があります。したがって、値が等しい可能性があるため、値が等しくないと想定することはできません。未知の値を比較することは、すべての可能な値を比較することと同じであり、それを無効にする可能性のある値が1つあるため、ステートメントはfalseです。
デフォルト値なしで変数を宣言するときに私が間違っていなければ、割り当てられた値はnullです。したがって、2つのSELECT CASEステートメントでは、nullを実際の値と比較しているため、比較は機能しません。