我的 sql 服务器上没有得到简单的 bool 代数。根据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 语句进入 ELSE。
但是 equals 运算符的官方文档将是错误的。我简直不敢相信!
有人能解释一下这种行为吗?
非常感谢您的帮助!
编辑(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)
打印语句写入“False”,但插入运行没有错误。 SQL-Server 似乎否定了检查约束,以便搜索不满足约束检查的行:
IF EXISTS (SELECT * FROM inserted WHERE NOT(Value>NULL)) <Generate error>
由于检查约束的计算结果为未知,因此否定也是未知的,并且 SqlServer 找不到任何违反检查约束的行。
最佳答案
是的,该链接是错误的。在 Microsoft Connect 上提交文档错误.
Sql 使用三值逻辑而不是 bool 逻辑。 true
、false
和 未知
大多数涉及 NULL
的比较运算符(即排除 IS [NOT] NULL
)都会导致 unknown
而非 True
或False
。根据真值表,否定未知会产生未知 shown here .
关于sql-server - T-SQL : What is NOT(1=NULL)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9707111/