4

SQL で 10/NULL が NULL (または不明) と評価されるのはなぜですか? 例 :

if((10/NULL) is NULL)
    DBMS_OUTPUT.PUT_LINE("Null.");

ただし、1 = NULLCOMPARISON であることは FALSE と見なされます。10/NULL も FALSE と見なすべきではありませんか?

私はSQLのみを参照しています。特定の DBMS ではありません。重複している可能性がありますが、このクエリの検索にどのキーワードを入力すればよいかわかりませんでした。

4

4 に答える 4

7

10 / NULLもFALSEと見なされるべきではありませんか?

いいえ、理由:

nullを含む算術式は、常にnullと評価されます。たとえば、10に追加されたnullはnullです。実際、nullオペランドが与えられると、すべての演算子(連結を除く)はnullを返します。

オラクルのマニュアルから引用した私の強調:http://docs.oracle.com/cd/E11882_01/server.112/e26088/sql_elements005.htm#i59110

そして、これはSQL標準で要求されています。

質問は一般的にRDBMSに関するものだったので、編集します。

SQLサーバー

SET ANSI_NULLSがONの場合、1つまたは2つのNULL式を持つ演算子はUNKNOWNを返します

マニュアルへのリンク

MySQL

NULLを含む式は、特定の関数または演算子のドキュメントに特に明記されていない限り、常にNULL値を生成します。

マニュアルへのリンク

DB2

いずれかのオペランドがnullになる可能性がある場合、結果はnullになる可能性があり、いずれかがnullの場合、結果はnull値になります。

マニュアルへのリンク

PostgreSQL

残念ながら、PostgreSQLのマニュアルにはそのような明示的なステートメントは見つかりませんでしたが、同じように動作することは確かです。


警告:「(連結を除く)」は、Oracleのみの非標準の例外です。(空の文字列とNULLは、Oracleではほとんど同じです)。nullを連結すると、他のすべてのDBMSでnullが発生します。

于 2012-09-24T12:36:00.923 に答える
1

1 = null は null ではありません。実は不明です。他のヌル操作と同様。

于 2012-09-24T12:30:27.947 に答える
1

等価述語1 = NULLは NULL に評価されます。しかしNULL、ブール比較では false と見なされます。

のようなことをするとNOT( 1 = NULL )、に評価1 = NULLされNULL、 にNOT( NULL )評価されNULL、条件全体が false に評価されます。

Oracle のドキュメントには、比較および条件ステートメントでの NULL 値の処理に関するセクションがあります。他のデータベースでも、非常によく似た方法で処理されます。

于 2012-09-24T12:32:11.753 に答える
0

10 /何かは、10に「何か」がいくらになるかを数えていることを意味します。この場合、10に「何もない」がどれだけあるかを数えています。これは無限大です。不明です。1= 1が等しくないため、NULLは偽です。なし

NULLIF関数は、2つのパラメーターを受け入れます。最初のパラメーターが2番目のパラメーターと等しい場合、NULLIFはNullを返します。それ以外の場合は、最初のパラメーターの値が返されます。NULLIF(value1、value2)

NVL NVL関数は、2つのパラメーターを受け入れます。最初の非NULLパラメータを返します。すべてのパラメータがNULLの場合はNULLを返します。

この条件付きの結果も確認してください。

この「nullは不明な真理値に等しい」という命題は、SQL3VLに不整合をもたらします。大きな問題の1つは、nullの基本的なプロパティである伝播のプロパティと矛盾することです。ヌルは、定義上、すべてのSQL式を介して伝播します。ブール真理値にはこのプロパティがありません。SQL:1999の次のシナリオを検討してください。このシナリオでは、2つのブール真理値が複合述語に結合されています。SQL 3VLの規則に従い、この記事の前半で示した3VL真理値表に示されているように、次のステートメントが成り立ちます。

(TRUEまたはUNKNOWN)→TRUE

(FALSE AND UNKNOWN)→FALSE

ただし、nullは伝播するため、nullをUNKNOWNとして扱うと、SQL3VLで次の論理的な不整合が発生します。

(TRUE OR NULL)→NULL(= UNKNOWN)

(FALSE AND NULL)→NULL(= UNKNOWN)

SQL:1999標準では、この不整合に対処する方法が定義されておらず、実装によって結果が異なる可能性があります。これらの不整合とベンダーからのサポートの欠如のために、SQLブールデータ型は広く受け入れられませんでした。現在、ほとんどのSQL DBMSプラットフォームは、ブール型データを格納するための独自のプラットフォーム固有の推奨事項を提供しています。SQLのPostgreSQL実装では、null値がすべての不明な結果を表すために使用され、次の評価が行われることに注意してください。

(TRUEまたはNULL)→TRUE

(FALSE AND NULL)→FALSE

(FALSEまたはNULL)ISNULL→TRUE

(TRUE AND NULL)ISNULL→TRUE

于 2012-09-24T12:39:17.227 に答える