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
のですか?
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
のですか?
NULL
は、IS NULL
を除くすべての条件で無視されます。ルーレットで0
ような何か:)
クエリ以下の使用を照会を実行するときには等価をチェックし、WOFFは値ですが、nullは値がないことを示します。 もちろん、no-valueはどの値とも等しくないことがあります。
x = 'Y'、 'x' = 'N' THENの場合は、 'N' END' - 理解できない? 'CASE'ステートメントは、単純な単一文字' x'と同等です。 – i486
:
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
私はnullが正式に "不明な値"と指定されていると思います。これは、通常の真の偽のチェックでは解決できません。
この例では、どの値が異常でないかを知りたいとします。コンパイラに関してはnullがunknown
であるため、コンパイラには問題があるかもしれませんが、残念ながらそれはどちらの方法でも証明できず無視するようにプログラムされています。潜在的に間違ったanserを返します。
したがって、値is null
や値is not null
などの特定のチェックを含める必要があります。これにより、文が変更されて、未知数または未知のすべての値が返されます。
NULLは何にも等しくないか、等しくないためです。 'IS NULL'か' IS NOT NULL'を使う必要があります。 'NULL'は基本的に未知/未定義を意味し、未知/未定義の値が' WOFF'と等しくないかどうかをデータベースがどのように知ることができるのか? –
[SQLの3値論理]へようこそ(https://en.wikipedia.org/wiki/Null_(SQL)#Comparisons_with_NULL_and_the_three-valued_logic_.283VL.29) –
予期した結果が間違っていますが、現在の結果は正しいです。 – jarlh