sql-server - T-SQL : What is NOT(1=NULL)?

标签 sql-server tsql ansi-nulls

我的 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 逻辑。 truefalse未知

大多数涉及 NULL 的比较运算符(即排除 IS [NOT] NULL)都会导致 unknown 而非 TrueFalse。根据真值表,否定未知会产生未知 shown here .

关于sql-server - T-SQL : What is NOT(1=NULL)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9707111/

相关文章:

SQL即使没有子行也返回父行

sql - 如何提高聚集索引查找的性能

sql - 如果引用不存在的表/列,导致创建存储过程失败

sql-server - 检查 SQL Server 数据库是否在 MULTI_USER 模式下运行

c# - 使用列表更新 SQL Server 数据库

sql - Where 子句取决于变量的值

sql - 删除SQL中除第一条记录外的重复记录

sql - 关闭 ANSI_NULLS 时的 T-SQL/意外 NULL 处理

sql - 从高度/体重表计算 BMI