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’,但插入运行没有错误. IF EXISTS (SELECT * FROM inserted WHERE NOT(Value>NULL)) <Generate error> 由于check-constraint的计算结果为UNKNOWN,因此否定也是UNKNOWN,并且SqlServer没有找到任何违反check-constraint的行. 解决方法您链接到的Equals的MSDN页面肯定显示不正确.检查MSDN页面是否为SET ANSI_NULLS.
要使该示例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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |