私はこの記事を読んでいました: 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))
この質問への回答については、これを参照してください スレッド 。
nULLを含むリレーショナル式は、実際には再びNULLを生成します
編集
ここで、<>
は任意の二項演算子を表し、NULL
はSQLプレースホルダー、value
は任意の値です(NULL
はnot価値):
NULL <> value
-> NULL
NULL <> NULL
-> NULL
論理は次のとおりです。NULL
は「値なし」または「不明な値」を意味するため、実際の値との比較は意味がありません。
X = 42
は、どの値(anyの場合)X
が保持されているかわからない場合、true、false、またはunknownですか? SQLはそれが不明であると言います。両方が不明であるとすると、X = Y
は真、偽、または不明ですか? SQLによると、結果は不明です。そして、それは論理的である(モデルにNULLがあるとしても)バイナリ関係演算についてそう言っています。
SQLは、2つの単項接尾辞演算子IS NULL
とIS NOT NULL
も提供します。これらは、オペランドに応じてTRUEまたはFALSEを返します。
NULL IS NULL
-> TRUE
NULL IS NOT NULL
-> FALSE
その動作は確立された 三元論理 に従うため、NULLは不明な値と見なされます。
NULLを不明と考えると、はるかに直感的になります。
unknown a
に等しい unknown b
?知る方法がないので、unknown
。
null
を含むすべての比較は未定義であり、falseと評価されます。この考えは、null
がnull
と同等であると評価されるのを防ぎ、null
がnull
と同等でないと評価されるのを防ぎます。
簡単な答えは...NULLは奇妙です、実際には期待どおりに動作しません。
これは、SQLでNULLがどのように機能するかについてのすばらしい論文です。トピックの理解を深めるのに役立つと思います。式でnull値を処理するセクションは、特に役立つと思います。
http://www.Oracle.com/technology/oramag/Oracle/05-jul/o45sql.html
これがクイックフィックスです
ISNULL(A、0)= ISNULL(B、0)
0は、データでは決して発生しないものに変更できます
式内のnullのデフォルト(ANSI)の動作は、nullになります(その場合、他にも十分な答えがあります)。
ただし、リストされていないMS Sql Serverを処理するときに、いくつかのEdgeのケースと警告があります。
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
「不明なaは不明なbと等しいですか?知る方法がないので、不明です。」
問題は、なぜ比較でFALSEが得られるのかということでした。
3値論理が与えられた場合、比較によってUNKNOWN(FALSEではない)が得られることは確かに賢明です。ただし、SQLはFALSEを生成し、UNKNOWNは生成しません。
SQL言語における無数の倒錯の1つ。
さらに、次のことを考慮に入れる必要があります。
「不明」が3値論理の論理値である場合、両方がたまたま「不明」(の値)である2つの論理値間の等式比較は、TRUEを生成するはずです。
論理値自体が不明な場合は、論理値が既知である(「不明」である)ことを意味するため、値を「不明」にすることで表すことはできません。つまり、関係理論が、3値論理の実装が4値論理の要件を引き上げ、4値論理が5値論理などの必要性に無限につながることをどのように証明するかです。