当不是在数学或其他语言中时,为什么sql中的null*0=null
为什么“当不是在数学或其他语言中时,为什么sql中的null*0=null,sql,math,null,Sql,Math,Null,为什么“null*0=null” 不能有任何其他结果,为什么null*0没有计算为0? 这可能与我不熟悉的更高层次的数学有关,还是可能对dbms有一些影响?通过各种操作方式保持NULL状态是明智的设计选择。将0相乘作为例外会导致不一致,例如 0 * NULL; # 0 1 * NULL; # NULL .5 * NULL; # HALFNULL? ;-) SQL中的NULL表示“未知”。当对未知项执行数学运算时,即使将其乘以零,也不可能得到任何已知项。类似的情况也发生在数学中:尽管将任何数
null*0=null
”
不能有任何其他结果,为什么null*0
没有计算为0
?
这可能与我不熟悉的更高层次的数学有关,还是可能对dbms有一些影响?通过各种操作方式保持
NULL
状态是明智的设计选择。将0相乘作为例外会导致不一致,例如
0 * NULL; # 0
1 * NULL; # NULL
.5 * NULL; # HALFNULL? ;-)
SQL中的
NULL
表示“未知”。当对未知项执行数学运算时,即使将其乘以零,也不可能得到任何已知项。类似的情况也发生在数学中:尽管将任何数字乘以零都会得到零,但它只是ANSI标准的一部分。某些情况可以在某些系统上重写(例如,在MS SQL上比较空值)
总之,它是关于避免未定义的行为。null*0
应该给出什么?什么类型的null
?有太多的事情会扼杀可预测性。在编程中,null
通常作为一个特殊值处理,出于充分的理由-我不知道
毕竟是No
之外的东西:)当然,Objective-C设计师不会同意我的观点D
至于这与数学有什么关系,
null
显然不是实数,所以null*0
对于实数是未定义的。您必须有一个包含null
的“较大”数字类别,并且必须重新定义*
操作(或不重新定义)。当你在处理数学问题时,不要忘记约束条件——像A*0=0
这样的规则只适用于它们的数字类别Infinity*0
不是0
-它是未定义的。几乎任何使用NULL
的操作都会导致NULL
,除了为NULL
和非NULL
。(注意:NULL
布尔值被视为“false”。)这就是SQL的定义方式。我认为“更高层次的数学”与此无关。我的假设是,在涉及NULL
的操作结束时,更容易、更安全地假设它将导致NULL
,而不是将NULL
视为某种值。在(null传播、3值逻辑、连接null等)NB,StackOverflow处标记的描述是“null表示无任何内容或未知,具体取决于上下文。”@GordonLinoff我不认为空布尔值被视为false,是吗?我认为它们被视为非true
,这可能被推断为false,但实际上是未知的,因此不是false或true。我承认,我实际上没有检查标准,但肯定不会将空布尔值视为false。在Objective中e-C、nil和nil与NULL有很大不同。NULL或YES=YES;它被保证为YES,0*NULL也可以保证为0,但它不在SQL中。允许NULL
在布尔上下文中假设false
值可能在语义上不一致,如果您愿意,但它与大多数编程语言一致。选择您的方法uble标准;-)哦,我的意思是,在SQL中,null或yes会导致yes。