2017-06-09 7 views
0

TSQLスクリプト以下nullを無視しないのはなぜですか?

declare @t table(x varchar(50) null) 
insert into @t values(null),('Y'),('N'),('WOFF') 
select * 
from @t t 
where t.x not in ('WOFF') 

に見てください出力が

Y 
N 

です。しかし予想SQLスクリプトで間違っている何

NULL 
Y 
N 

のですか?

+4

NULLは何にも等しくないか、等しくないためです。 'IS NULL'か' IS NOT NULL'を使う必要があります。 'NULL'は基本的に未知/未定義を意味し、未知/未定義の値が' WOFF'と等しくないかどうかをデータベースがどのように知ることができるのか? –

+2

[SQLの3値論理]へようこそ(https://en.wikipedia.org/wiki/Null_(SQL)#Comparisons_with_NULL_and_the_three-valued_logic_.283VL.29) –

+0

予期した結果が間違っていますが、現在の結果は正しいです。 – jarlh

答えて

3

あなたがこれを行う必要がある場合がありますがあるように起こっているので

SELECT CASE WHEN x = 'Y' THEN 'Y' WHEN x = 'N' THEN 'N' END 
FROM @t t 
WHERE t.x NOT IN ('WOFF') OR t.x IS NULL 
+2

または 'ISNULL(tx、 'null')が 'WOFF'にない場合 – i486

+0

はい、良い点 – Jayvee

1

NULLは、IS NULLを除くすべての条件で無視されます。ルーレットで0ような何か:)

0

クエリ以下の使用を照会を実行するときには等価をチェックし、WOFFは値ですが、nullは値がないことを示します。 もちろん、no-valueはどの値とも等しくないことがあります。

+0

x = 'Y'、 'x' = 'N' THENの場合は、 'N' END' - 理解できない? 'CASE'ステートメントは、単純な単一文字' x'と同等です。 – i486

2

declare @t table(x varchar(50) null) 
insert into @t values(null),('Y'),('N'),('WOFF') 
select * 
from @t t 
where t.x not in ('WOFF') or t.x is null 

または

declare @t table(x varchar(50) null) 
insert into @t values(null),('Y'),('N'),('WOFF') 
select * 
from @t t 
where t.x not in ('WOFF') or t.x is not null 
1

私はnullが正式に "不明な値"と指定されていると思います。これは、通常の真の偽のチェックでは解決できません。

この例では、どの値が異常でないかを知りたいとします。コンパイラに関してはnullがunknownであるため、コンパイラには問題があるかもしれませんが、残念ながらそれはどちらの方法でも証明できず無視するようにプログラムされています。潜在的に間違ったanserを返します。

したがって、値is nullや値is not nullなどの特定のチェックを含める必要があります。これにより、文が変更されて、未知数または未知のすべての値が返されます。

関連する問題