web-dev-qa-db-ja.com

nullがnullと等しくない理由false

私はこの記事を読んでいました: SQLでnullを取得== null

そして、コンセンサスは、2つの(null許容)SQL列間の同等性をテストしようとする場合、正しいアプローチは次のとおりです。

where ((A=B) OR (A IS NULL AND B IS NULL))

AとBがNULLの場合でも、NULLはNULLと等しくないため、(A = B)はFALSEを返します。そのため、追加のチェックが必要です。

不平等をテストするときはどうですか?上記の議論に続いて、不平等をテストするには、次のようなことをする必要があると思いました。

WHERE ((A <> B) OR (A IS NOT NULL AND B IS NULL) OR (A IS NULL AND B IS NOT NULL))

しかし、私はそれが必要ではないことに気づきました(少なくともinformix 11.5では)、そして私はただすることができます:

where (A<>B)

AとBがNULLの場合、これはFALSEを返します。 NULLがNULLと等しくない場合、これはTRUEを返すべきではありませんか?

[〜#〜]編集[〜#〜]
これらはすべて良い答えですが、私の質問は少し曖昧だったと思います。言い換えさせてください:

AまたはBのいずれかがNULLになる可能性がある場合、それらの不等式を次のようにチェックするだけで十分ですか。

where (A<>B)

または、次のように明示的に確認する必要がありますか?

WHERE ((A <> B) OR (A IS NOT NULL AND B IS NULL) OR (A IS NULL AND B IS NOT NULL))

この質問への回答については、これを参照してください スレッド

21
rouble

nULLを含むリレーショナル式は、実際には再びNULLを生成します

編集

ここで、<>は任意の二項演算子を表し、NULLはSQLプレースホルダー、valueは任意の値です(NULLnot価値):

  • NULL <> value-> NULL
  • NULL <> NULL-> NULL

論理は次のとおりです。NULLは「値なし」または「不明な値」を意味するため、実際のとの比較は意味がありません。

X = 42は、どの値(anyの場合)Xが保持されているかわからない場合、true、false、またはunknownですか? SQLはそれが不明であると言います。両方が不明であるとすると、X = Yは真、偽、または不明ですか? SQLによると、結果は不明です。そして、それは論理的である(モデルにNULLがあるとしても)バイナリ関係演算についてそう言っています。

SQLは、2つの単項接尾辞演算子IS NULLIS NOT NULLも提供します。これらは、オペランドに応じてTRUEまたはFALSEを返します。

  • NULL IS NULL-> TRUE
  • NULL IS NOT NULL-> FALSE
26
just somebody

その動作は確立された 三元論理 に従うため、NULLは不明な値と見なされます。

NULLを不明と考えると、はるかに直感的になります。

unknown a に等しい unknown b?知る方法がないので、unknown

34
Ben S

nullを含むすべての比較は未定義であり、falseと評価されます。この考えは、nullnullと同等であると評価されるのを防ぎ、nullnullと同等でないと評価されるのを防ぎます。

7
Adam Robinson

簡単な答えは...NULLは奇妙です、実際には期待どおりに動作しません。

これは、SQLでNULLがどのように機能するかについてのすばらしい論文です。トピックの理解を深めるのに役立つと思います。式でnull値を処理するセクションは、特に役立つと思います。

http://www.Oracle.com/technology/oramag/Oracle/05-jul/o45sql.html

4
Robert Greiner

これがクイックフィックスです

ISNULL(A、0)= ISNULL(B、0)

0は、データでは決して発生しないものに変更できます

3
Alireza Rinan

式内のnullのデフォルト(ANSI)の動作は、nullになります(その場合、他にも十分な答えがあります)。

ただし、リストされていないMS Sql Serverを処理するときに、いくつかのEdgeのケースと警告があります。

  • 値をグループ化するステートメント内のヌルは等しいと見なされ、グループ化されます。
  • それらを順序付けているステートメント内のNULL値は、等しいと見なされます。
  • クエリの個別の側面を評価するときに、distinctを使用しているステートメント内で選択されたnull値は等しいと見なされます

SQL Serverでは、SET ANSI_NULLS OFFを使用して、特定のNull = Nullテストに関する式ロジックをオーバーライドすることができます。これにより、null値が等しくなります。これは推奨される移動ではありませんが、存在します。

SET ANSI_NULLS OFF

select result =
    case
        when  null=null then 'eq' 
        else 'ne'
    end

SET ANSI_NULLS ON

select result =
    case
        when  null=null then 'eq' 
        else 'ne'
    end
3
Andrew

「不明なaは不明なbと等しいですか?知る方法がないので、不明です。」

問題は、なぜ比較でFALSEが得られるのかということでした。

3値論理が与えられた場合、比較によってUNKNOWN(FALSEではない)が得られることは確かに賢明です。ただし、SQLはFALSEを生成し、UNKNOWNは生成しません。

SQL言語における無数の倒錯の1つ。

さらに、次のことを考慮に入れる必要があります。

「不明」が3値論理の論理値である場合、両方がたまたま「不明」(の値)である2つの論理値間の等式比較は、TRUEを生成するはずです。

論理値自体が不明な場合は、論理値が既知である(「不明」である)ことを意味するため、値を「不明」にすることで表すことはできません。つまり、関係理論が、3値論理の実装が4値論理の要件を引き上げ、4値論理が5値論理などの必要性に無限につながることをどのように証明するかです。

0
Erwin Smout