sql-server – T-SQL:什么是NOT(1 = NULL)?

前端之家收集整理的这篇文章主要介绍了sql-server – T-SQL:什么是NOT(1 = NULL)?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的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

猜你在找的MsSQL相关文章