2012-01-25 4 views
5

私はSQLで書いている手続きで興味深い問題に直面しました。SQL日付変数とnullをこのように比較するのはなぜですか?

私のprocでは2つの日付があります。これはオプションのparamsがNULLにデフォルト設定されています。これらのparamsがnullでないか、procの一部を実行しないかどうかを確認したい場合は、無視されます。

私は非常に基本的なIF(@dateVariable <> NULL AND @DateVariable2 <> NULL)ステートメントを実行しましたが、変数がNULLでなくてもifステートメントは機能しません。SQLはNULLを日付と比較するのに苦労しています。

これを回避するには、ちょうど正しく動作するIF(DateVariable IS NOT NULL)を実行しました。私もIF(ISNULL(@DateVariable,'') <> '')も正しく試しました

私の質問は、最初のIFは動作しませんが、2番目と3番目のIFは両方ともどちらかの点で変数の内容をnullと比較する必要があるからですか?

例:

-----は-----

DECLARE @Date DATETIME 
SET @Date = CURRENT_TIMESTAMP 

IF (@Date <> NULL) 
BEGIN 
    print('a') 
END 

-----は-----

DECLARE @Date DATETIME 
SET @Date = CURRENT_TIMESTAMP 

IF (ISNULL(@Date,'') <> '') 
BEGIN 
    print('a') 
END 

DECLARE @Date DATETIME 
SET @Date = CURRENT_TIMESTAMP 

IF (@Date IS NOT NULL) 
BEGIN 
    print('a') 
END 
+3

[3値論理(http://www.simple-talk.com/sql/learn-sql-server/sql-and-the-snare-of-three-valuedを見ます-logic /) –

+0

「NULL」を「未知の値」と考えてください。 '@Date = Unknown Yet Value'は何をもたらすべきですか? 「真」? 「偽」?あるいは「わからない」? –

答えて

13

は、簡単に言えワークス失敗「NULL 'は' NULL 'に等しくありません。 'NULL'は不確実性の状態に匹敵します。不確かさと不確実性が必ずしも等しくないことはありません。ヌルをテストするときは、 'IS NULL'、 'ISNULL()'、または 'COALESCE()'を使用します。 ANSI_NULLSを 'off'に設定すると、この動作は変更できますが、ANSI SQL標準ではありません。詳細はhttp://msdn.microsoft.com/en-us/library/ms191270.aspxを参照してください。

4

null値を比較する場合は注意が必要です。 比較の動作は、SET ANSI_NULLSオプションの設定によって異なります。

SET ANSI_NULLSがONの場合、 式のうちの1つ以上がNULLである比較がTRUEまたはFALSEを返さない。 UNKNOWNが生成されます。これは、不明な値を論理的に他の値と比較することができないためです。これは、式 のいずれかがリテラルNULLと比較された場合、または2つの式が比較された場合に発生します。 のいずれかがNULLに評価されます。

NULL Comparison Search Conditions

+2

'SET ANSI_NULLS OFF'は推奨されていません。 http://msdn.microsoft.com/en-us/library/ms143729.aspx –

関連する問題