web-dev-qa-db-ja.com

Oracleで= NULLが機能しないのはなぜですか?

リテラルとNULLを比較するには、特別な構文IS NULLを使用する必要があることに最近気付きました。

ここで= NULLが機能しないのはなぜですか?

6
Lazer

NULLに関するPSOUGのメモ を見てください。 Fabricio Araujoがほのめかしたように、NULLは実際には4や文字列「ベーコンストリップ」のような値ではありません。実際、SQL言語ではNULLは ntyped であるため、等価比較でNULLを有効に使用できません。特別なIS [NOT] NULL構文を使用して、値がNULLかどうかを確認します。

13
Nick Chammas

SQL Serverには、=NULLIS NULLと同じように動作するように接続設定があります。しかし、最新バージョンではもう推奨されていません-非推奨としてマークされています。

推奨されるのは、SQL標準の方法であるIS [NOT] NULL演算子です。

(そして、ここでは「NULLが値またはステータスであるかどうかにかかわらず、戦争を開始しません)...... hehehe

5
Fabricio Araujo

_is null_構文を正当化するのではなく、nullsとそれらを処理するために使用される構文を扱う際の一般的な経験則がないことを指摘する方が良いと思います。例えば:

  1. 値の更新には、_set val = null_構文をよりよく反映する_set val to null_などの構文ではなく、_is null_のような構文を使用します。
  2. nullを処理する場合、ほとんどの場合間違いです。「nullはここではのように動作するため、ここではそのように動作する必要があります

ここ は、postgresの観点からこの主題についての優れたエッセイです。簡単にまとめると、nullはコンテキストに応じて異なる方法で処理され、nullについての仮定を間違えないようにしています。

OracleはNULLを不明な値として扱います。この平等が機能するかどうか自問してください。

(unknown amount in George's wallet) = (unknown amount in Harry's wallet)

または別の方法で述べた

NULL = NULL

答えは明らかに多分、それは真実でも偽でもありません。

編集:コメントに応えて、私はそれが使用されているのを見たので、NULLに少し明確化を追加します。

NULLは実際には「設定されていない」ことを意味しますが、この質問の文脈では、上記の記述は正しいと思います。

列がNULL値を持つ理由はいくつかあります。

  • 列が行のサブタイプまたは状態に適切ではありません。 (値を設定してはいけないことがわかっています。この場合、列の値を別の値と比較するべきではありません。IS NULLのテストが役立つ場合があります。)
  • 値が利用できないか、列に記録されていません。 (値は存在しますが、何らかの理由でデータベースに認識されていません。これらの場合、NULLはデータベースに不明と同等です。)

一部のコンテキストでは、NULLは、次のように正しくないと考えられる方法で処理される場合があります。

  • NULL値はデフォルト値で置き換えることができます。未設定のNOT NULL番号は、値が0である可能性があります(これは、値が0であることがわかっているとは限りません)。
  • 空の文字列はNULLに、またはその逆に変換されます。 (値は既知、空の場合があります。)
1
BillThor