5

以下

IF 1 = NULL 
    BEGIN
        SELECT  'A'
    END
ELSE 
    BEGIN
        SELECT  'B'
    END

期待どおりに結果 B を返します

ここで物事が本当に面白くなります

IF 1 != NULL 
    BEGIN
        SELECT  'A'
    END
ELSE 
    BEGIN
        SELECT  'B'
    END

B も返す

これはなぜですか?

4

6 に答える 6

7

どちらIFのステートメントも真実ではありません。 NULLは何かに等しいわけでも、何かに等しくないわけでもありません。またはのいずれIS NULLIS NOT NULL

于 2013-05-16T21:13:01.070 に答える
2

それは物ではなく、実際には物の不在であるNULLため、等しいことも等しくないこともありません。NULL

ANSI SQL 1999 (ただし、まだ MSSQL ではありません) には、期待される結果IS [NOT] DISTINCT FROMで使用できるメソッドが含まれています。NULL

IS DISTINCT FROM と IS NOT DISTINCT FROM を書き換えるには?

これは、 Itzik Ben-Gan による、一般的IS DISTINCT FROMな動作と紛らわしい性質に関する優れた投稿です。NULL

http://sqlmag.com/sql-server/not-distinct

述語は、TRUE、FALSE、または UNKNOWN に評価できます。述語は、NULL が含まれる場合は常に UNKNOWN と評価されます。

Erland Sommarskog はそれを望んでいます。

http://www.sommarskog.se/wishlist.html#isdistinctfrom

SQL:1999 では、演算子 IS DISTINCT FROM および IS NOT DISTINCT FROM が定義されています。これらは、NULL 値にも適用されることを除いて、それぞれ <> および = と同じです。

(Erland から) MVP の Steve Kass がこの機能をリクエストしている Connect のリンクは次のとおりです。

http://connect.microsoft.com/SQLServer/feedback/details/286422/add-language-and-optimizer-support-for-iso-distinct-predicate

これは一般的な要件ですが、多くの列に対してこれをコーディングするのは面倒で、エラーが発生しやすくなります (特に AND/OR の優先順位の問題のため)。ANSI_NULLS の設定を変更することは解決策ではありません。列と列の比較には影響せず、列と変数の比較にのみ影響するためです。ANSI_NULLS を off に設定することも非標準であり、単一のクエリで特定の比較に適用するには十分な粒度ではありません。

于 2013-05-16T21:32:49.523 に答える
0

NULL が指定されているのは、ある意味で <,>,=,!= 演算子とは比較にならないことだと思います。このような比較では、おそらく NULL が返されます。その後、if(NULL)処理はスキップされます。

于 2013-05-16T21:13:25.387 に答える