我的 sql-server 上没有简单的布尔代数。根据 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=NULL”的计算结果为“UNKNOWN”。NOT(UNKNOWN) 仍然是 UNKNOWN ( msdn ),这将强制 CASE-Statement 进入 ELSE。
但是,equals-operator 的官方文档是错误的。我无法相信这!
任何人都可以解释这种行为吗?
非常感谢您的帮助!
编辑(2012-03-15):
我刚刚发现你们中的一些人可能会感兴趣的一件事:
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>
由于检查约束的计算结果为 UNKNOWN,否定也是 UNKNOWN 并且 SqlServer 没有找到任何违反检查约束的行。