And*_*eas 7 t-sql sql-server ansi-nulls
我的sql-server上没有简单的布尔代数.根据msdn,以下语句应返回"1",但在我的服务器上它返回"0".你能帮助我吗?
SET ANSI_NULLS ON
SELECT CASE WHEN NOT(1=NULL) THEN 1 ELSE 0 END
Run Code Online (Sandbox Code Playgroud)
请看看msdn.它明确指出:"将NULL与非NULL值进行比较总是导致FALSE." - 无论ANSI_NULLS设置是什么.因此,"1 = NULL"应为FALSE,因此NOT(FALSE)应为TRUE,语句应返回"1".
但在我的机器上,它返回"0"!
一种解释可能是,"1 = NULL"评估为"UNKNOWN".NOT(UNKNOWN)仍然是UNKNOWN(msdn),它会强制CASE语句进入ELSE.
但是,等于运营商的官方文件是错误的.我无法相信这!
任何人都可以解释这种行为吗?
非常感谢您的帮助!
编辑(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)
Run Code Online (Sandbox Code Playgroud)
print-Statement写入'False',但插入运行没有错误.SQL-Server似乎否定了检查约束,以便搜索不满足约束检查的行:
IF EXISTS (SELECT * FROM inserted WHERE NOT(Value>NULL)) <Generate error>
Run Code Online (Sandbox Code Playgroud)
由于check-constraint的计算结果为UNKNOWN,因此否定也是UNKNOWN,并且SqlServer没有找到任何违反check-constraint的行.
是的,链接是错误的.在Microsoft Connect上提交文档错误.
Sql使用三值逻辑而不是布尔逻辑.true,false和unknown
大多数比较运算符(即排除IS [NOT] NULL)涉及NULL结果unknown不是True或False.根据此处显示的真值表,否定未知的未知数.
您链接到的Equals的MSDN页面肯定显示不正确.
检查SET ANSI_NULLS的MSDN页面.
当SET ANSI_NULLS为ON时,对空值的所有比较都计算为UNKNOWN.
要使该示例SQL语句按预期工作,您应该使用"IS NULL"或"IS NOT NULL"而不是使用equals运算符(=)进行比较.例如:
SELECT CASE WHEN NOT(1 IS NULL) THEN 1 ELSE 0 END
要么
SELECT CASE WHEN (1 IS NOT NULL) THEN 1 ELSE 0 END