为什么SQL最终将NULL值视为FALSE?

时间:2015-06-25 02:51:25

标签: mysql sql null

由于function orbitalPeriod(arr) { var GM = 398600.4418, earthRadius = 6367.4447; return arr.map(function (o) { return { name: o.name, orbitalPeriod: Math.round((2 * Math.PI) * Math.sqrt(Math.pow(o.avgAlt + earthRadius, 3) / GM)) }; }); } orbitalPeriod([{name : "sputkin", avgAlt : 35873.5553}]); 它只是一个未知或缺失的值,所以它可能是NULL但我们不知道。为什么TRUE推定?是否有任何理由除了"它显而易见" (既然不是)或者应该被认为是一种SQL糟糕的设计工件?

代表:

FALSE

并且某些行为空SELECT * FROM `rainbow_table` WHERE `show_me` 。我们真的不知道是否应该输出这些行,也许最好显示它(作为防止数据丢失的最后机会)?似乎SQL是由悲观主义者开发的。

4 个答案:

答案 0 :(得分:2)

SELECT语句的上下文中(因此,在ON子句,WHERE子句和CASE表达式中),谓词必须为{{1} }(不是TRUEFALSE 1 )要满足谓词。

但是,在UNKNOWN个约束中,谓词不能为CHECK才能满足。

即。以下脚本将起作用:

FALSE

因此,我们可以看到SQL中普遍为真CREATE TABLE T ( ID int not null, Val varchar(10) null, constraint CK_Vals CHECK (Val in ('abc','def')) ); INSERT INTO T(ID,Val) VALUES (10,NULL); 结果被视为UNKNOWN。通过使用FALSE包装生成UNKNOWN的谓词不会产生NOT (<existing predicate>)这一事实也可以轻而易举地证明这一点。

Three-Valued logic上的维基百科页面涵盖了很多细节。

1 我假设您的问题是关于TRUE而不是UNKNOWN,因为您已经标记了和{{3 }}。在标准SQL中,NULLUNKNOWN是两个截然不同的概念。只有(据我所知)将两者混为一谈。

答案 1 :(得分:1)

SQL并不真正将NULL视为false。相反,条件语句仅在条件计算结果为真时才被视为真。

效果是NULL被视为假。但这并不意味着NULL等同于假。

答案 2 :(得分:0)

在SQL中,NULL表示它有一些值,但我们不知道它是什么。这就是为什么当我们比较时我们使用这样的

Select * from table [table name] where [column name] is not NULL

答案 3 :(得分:0)

问题是Sql Server引擎是基于三值谓词逻辑构建的。如果谓词比较2个非空值,则可以将其评估为TRUEFALSE。如果其中至少有一个是NULL,那么谓词将评估为第三个逻辑值 - UNKNOWN

现在WHERE条款会发生什么?它的设计方式使它只返回谓词求值为TRUE的行!如果谓词的计算结果为FALSEUNKNOWN,则相应的行只会从结果集中过滤掉。

起初,这非常令人困惑,并导致新人进入SQL几个典型错误的世界。他们只是认为数据可能不包含NULL。一个典型的错误是例如:

Employyes(Name varchar, Contry varchar) 
'John', 'USA'
'Peter', NULL
'Mike', 'England'

并且您希望Contry不是USA的所有行。你只需写下:

select * from Employees where Country <> 'USA'

并且只获得:

'Mike', 'England'
结果是

。乍一看这非常令人困惑,但据您了解引擎正在进行三值逻辑,结果是合乎逻辑的。