我的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.
任何人都可以解释这种行为吗?
非常感谢您的帮助!
编辑(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>
由于check-constraint的计算结果为UNKNOWN,因此否定也是UNKNOWN,并且sqlServer没有找到任何违反check-constraint的行.
解决方法
您链接到的Equals的MSDN页面肯定显示不正确.
检查MSDN页面是否为SET ANSI_NULLS.
When SET ANSI_NULLS is ON,all comparisons against a null value
evaluate to UNKNOWN.
要使该示例sql语句按预期工作,您应该使用“IS NULL” or “IS NOT NULL”而不是使用equals运算符(=)进行比较.例如:
SELECT CASE WHEN NOT(1 IS NULL),然后1 ELSE 0 END
要么
SELECT CASE WHEN(1 IS NOT NULL)然后1 ELSE 0 END