SQL サーバーで単純なブール代数を取得できません。msdn によると、次のステートメントは "1" を返すはずですが、私のサーバーでは "0" を返します。手伝って頂けますか?
SET ANSI_NULLS ON
SELECT CASE WHEN NOT(1=NULL) THEN 1 ELSE 0 END
msdnをご覧ください。そこでは、「NULL を NULL 以外の値と比較すると、常に FALSE になります」と明確に述べられています。- ANSI_NULLS 設定が何であれ。したがって、"1=NULL" は FALSE で、NOT(FALSE) は TRUE である必要があり、ステートメントは "1" を返す必要があります。
しかし、私のマシンでは、「0」が返されます!
1つの説明は、「1 = NULL」が「UNKNOWN」と評価されるということです。NOT(UNKNOWN) はまだ UNKNOWN ( msdn ) であり、CASE ステートメントを ELSE に強制します。
しかし、equals-operator の公式ドキュメントは間違っているでしょう。それは信じられないよ!
誰でもこの動作を説明できますか?
助けてくれてありがとう!
編集 (2012-03-15):
私が見つけた 1 つのことは、あなたの一部にとって興味深いかもしれません:
CREATE TABLE #FooTest (Value INT)
ALTER TABLE #FooTest WITH CHECK ADD CONSTRAINT ccFooTestValue CHECK (Value>1)
PRINT '(NULL>1) = ' + CASE WHEN NULL>1 THEN 'True' ELSE 'False' END
INSERT INTO #FooTest (Value) VALUES (NULL)
print-Statement は「False」を書き込みますが、挿入はエラーなしで実行されます。SQL-Server は、制約チェックを満たさない行を検索するためにチェック制約を無効にしているようです。
IF EXISTS (SELECT * FROM inserted WHERE NOT(Value>NULL)) <Generate error>
check-constraint は UNKNOWN と評価されるため、否定も UNKNOWN であり、SqlServer は check-constraint に違反する行を検出しません。