6

例として、それがたとえば4x以外の値を持つ変数であると仮定します。null次の式は何を返す必要がありますか?

x != null

私がこれまでに使用したほぼすべてのプログラミング言語(C#、Javascript、PHP、Python)では、この式、またはその言語の同等の式は、に評価されtrueます。

一方、SQL実装はすべて、これをまったく異なる方法で処理しているようです。不等式演算子の一方または両方のオペランドが、のNULL場合、NULLまたはFalseが返されます。これは基本的に、ほとんどのプログラミング言語が使用する動作の反対であり、私には非常に直感的ではありません。

SQLでの動作がこのようになっているのはなぜですか?null汎用プログラミングとは大きく異なる動作をするリレーショナルデータベースロジックについてはどうでしょうか。

4

4 に答える 4

7

ほとんどのプログラミング言語の null は「既知」と見なされますが、SQL の NULL は「不明」と見なされます。

  • したがってX == null、X を既知の値と比較し、結果が既知 (真または偽) です。
  • しかし、X = NULLX を不明な値と比較し、結果は不明です (つまり、再び NULL)。結果として、それIS [NOT] NULLをテストするには特別なオペレーターが必要です。

このような NULL の動機の少なくとも一部は、外部キーの動作であると推測しています。外部キーの子エンドポイントが NULL の場合、たとえ親が NULL であっても、どの親とも一致しないはずです (これは、親が主キーではなく UNIQUE である場合に可能です)。残念ながら、これは解決するよりも多くの落とし穴をもたらします。個人的には、SQL は「既知の」null のルートをたどり、この猿のビジネスを完全に回避するべきだったと思います。

発明者またはリレーショナル モデルである EF Codd でさえ、後に従来の NULL は最適ではないことを示しました。しかし、歴史的な理由から、私たちはそれに固執しています。

于 2012-06-21T20:43:51.100 に答える
6

その理由は、平等の概念が null には適用されないためです。このヌルがこの他のヌルと等しい、または等しくないと言うのは論理的に正しくありません。

理論的な理由からはそれで問題ありませんが、便宜上、SQL で (x != null) と言うことができないのはなぜですか?

その理由は、null を別の方法で処理したい場合があるためです。たとえば、(columnA = columnB) と言うと、両方の列が null の場合に true を返す必要がありますか? (columnA != columnB) と言うと、列 A が「a」で列 B が null の場合と、列 A が「a」で列 B が「b」の場合と同じ結果になるはずですか?

SQLを作成した人々は、区別が重要であると判断したため、2つのケースを異なる方法で扱うように記述しました.

これに関するウィキペディアのページには、かなりまともな記事があります- http://en.wikipedia.org/wiki/Null_%28SQL%29

于 2012-06-21T20:22:35.573 に答える
1

SQLエンジンでは、通常、「=」演算子ではなく「IS」を使用します。これにより、より直感的になります。

SELECT 4 IS NULL FROM dual;
> 0


SELECT 4 IS NOT NULL FROM dual;
> 1

NULL は null ポインターを表すものではありません。まったく同じ概念ではありません。sql NULL は値フラグがわからないため、「ポインターがありません」フラグではありません。それらを比較したり、同じように使用したりしないでください。これはかなり直感的ではありません。あなたの言うとおりです。彼らは別の名前を付けるべきでした。

于 2012-06-21T20:15:05.180 に答える
0

SQL では、NULL「不明な値」を意味します。

x != NULL と言うと、「x の値が未知の値と等しくない」ということになります。未知の値が何であるかがわからないので、x がそれと等しいかどうかもわかりません。ですから、答えは「わかりません」です。

同様に:

x = NULL OR 1=2    -- Unknown. 1=2 is not true, but we don't know about x=NULL
x = NULL OR 1=1    -- True. We know that at least 1=1 is true, so the OR is fulfulled regardless.
x = NULL AND 1=1   -- Unknown. We want them both to be true to fulful the AND
x = NULL AND 1=2   -- False. We know 1=2 is false, so the AND is not fulfilled regardless.

また

-- Neither statement will select rows where x is null
select x from T where x = 1
select x from T where x != 1

null をチェックする唯一の方法は、「x の値がわからないというのは本当ですか」と明確に尋ねることです。これには、はいまたはいいえの答えがあり、ISキーワードを使用します。

null をゼロまたは別の値として扱いたい場合は、COALESCEorISNULL関数を使用できます。

COALESCE(NULL, 1)  -- 1
COALESCE(NULL, NULL, 1) -- Also 1
COALESCE(x, y, z, 0) -- x, unless it is null, then y, unless it is null, then z, unless it is null in which case 0.
于 2012-06-21T20:45:39.347 に答える