2012-03-30 8 views
2

私は1行、2行、3行とヌルでいっぱいです。なぜそこに二人は同じ結果を返しません:秒1は、宣伝通りに動作している間完全なリストにはありません

select * from foo where foobar not in (1, 2, 3); 
select * from foo where foobar is not null; 

最初のものは、空のセットを返します。今私はちょっと混乱しています:-Dどこの "初心者のためのSQLにはNULL"のドキュメントがありますか? :-D

あなたの最初の文は次のように評価されているためです

+0

[IS NULLとNULLの間に違いはありますか?](http://stackoverflow.com/questions/3777230/is-there-any-difference-between-y-null-and-null) –

+0

NULLと他の値の比較は、データベース管理システム(DBMS)で異なるように扱われます。 DBMSによっては、NULLSを処理する方法を設定するシステムがあります。 (私はOracleでの経験はありませんが、あなたが記述する出力はMicrosoft SQL Serverから得られるものです)多くのDBMSでは、where句にIS NULLを指定するだけで結果にNULL値が表示されます。これは何かを何も比較することができないという哲学的原理(NULL)に基づいて設計されています.... – mortb

答えて

5

を(それが重要ならば、私は、Oracleを使用しています):、

select * from foo 
where foobar <> 1 and foobar <> 2 and foobar <> 3 

"ヌル> 1 <は" NULLと評価true/falseではないので、何も返されません。

4

ためin

の反対ではありません。 foobarNULLの場合:
- テスト= 1が失敗します。
- しかし、<> 1も失敗します。

これは、常にNULL not in (1, 2, 3)が失敗することを意味します。


最初は慣れが必要NULL Logicのクセです。 NULLは、Unknownを意味することができます。つまり、1の可能性があります。それは不確定です。

ですから、is NULL in the list (1, 2, 3)を頼むとき答えはである私はそれが不確定だ、言うことができません。したがって、TRUEまたはFALSEではなく、回答自体はNULLです。

NULLTRUEではないため、この行はテストに失敗しました。

+0

'CREATE TABLE T(c INTEGER CHECK(c = 1)); INSERT INTO T VALUES(NULL); ' - 挿入は成功します!したがって、あなたのアサーションは、「NULLが常に失敗する」という論理演算はすべてfalseです。 – onedaywhen

+0

@onedaywhen - 実行されている実際のテストが制約の違反のためであるためです: 'NOT(c = 1)'ならエラーを出しますが、 'NOT(c = 1)'は失敗します。 * [私は差別化のために "間違っています"ではなく "失敗"という用語を使用しますが、特にこの場合は明確ではないかもしれません。] * – MatBailie

+1

SQL標準から、指定された検索条件が偽でない場合にのみ満足 "with: "where句の結果は、検索条件の結果が真であるTの行のテーブルです。" 「失敗」という用語を使用しているIMOは誤解を招いています。 'ブール演算'はNULLがNULLです '失敗しますか? ;) – onedaywhen

関連する問題