由于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是由悲观主义者开发的。
答案 0 :(得分:2)
在SELECT
语句的上下文中(因此,在ON
子句,WHERE
子句和CASE
表达式中),谓词必须为{{1} }(不是TRUE
或FALSE
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
,因为您已经标记了sql和{{3 }}。在标准SQL中,NULL
和UNKNOWN
是两个截然不同的概念。只有(据我所知)relational-algebra将两者混为一谈。
答案 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个非空值,则可以将其评估为TRUE
或FALSE
。如果其中至少有一个是NULL
,那么谓词将评估为第三个逻辑值 - UNKNOWN
。
现在WHERE
条款会发生什么?它的设计方式使它只返回谓词求值为TRUE
的行!如果谓词的计算结果为FALSE
或UNKNOWN
,则相应的行只会从结果集中过滤掉。
起初,这非常令人困惑,并导致新人进入SQL
几个典型错误的世界。他们只是认为数据可能不包含NULL
。一个典型的错误是例如:
Employyes(Name varchar, Contry varchar)
'John', 'USA'
'Peter', NULL
'Mike', 'England'
并且您希望Contry
不是USA
的所有行。你只需写下:
select * from Employees where Country <> 'USA'
并且只获得:
'Mike', 'England'
结果是。乍一看这非常令人困惑,但据您了解引擎正在进行三值逻辑,结果是合乎逻辑的。