让我们假设这x是一个除了null4 之外的任何值的变量,作为一个例子.下面的表达式应该返回什么?
x != null
Run Code Online (Sandbox Code Playgroud)
在我曾经使用的几乎所有编程语言(C#,Javascript,PHP,Python)中,这个表达式或该语言中的等价表达式的计算结果为true.
另一方面,SQL实现似乎完全不同地处理这个问题.如果不等式运算符的一个或两个操作数都是NULL,则返回NULL或False将返回.这基本上与大多数编程语言使用的行为相反,而且对我来说非常不直观.
为什么SQL中的行为是这样的?什么是关系数据库逻辑使得null行为与通用编程中的行为有很大不同?
大多数编程语言中的null被认为是"已知",而SQL中的NULL被认为是"未知".
X == null将X与已知值进行比较,结果已知(真或假).X = NULL将X与未知值进行比较,结果是未知的(即,再次为NULL).因此,我们需要一个特殊的操作员IS [NOT] NULL来测试它.我猜这种NULL的动机至少部分是外键的行为.当外键的子端点为NULL时,它不应与任何父项匹配,即使父项为NULL(如果父项是UNIQUE而不是主键,则可能).不幸的是,这带来了比它解决的更多陷阱,我个人认为SQL应该已经走了"已知"null的路线并完全避免了这种猴子业务.
甚至EF Codd,发明者或关系模型,后来也表明传统的NULL不是最优的.但由于历史原因,我们几乎坚持下去.
原因是平等的概念不适用于null.说这个null与其他null相等或不相等,这在逻辑上是不正确的.
所以,从理论上讲,这一切都很好,但为了方便起见,为什么sql不允许你说(x!= null)?
好吧,原因是因为有时候你想要以不同的方式处理空值.如果我说(columnA = columnB)例如,如果两列都为空,那么它应该返回true吗?如果我说(columnA!= columnB) - 当列A是"a"而列B是空时,当列A是"a"而列B是"b"时,它是否应该给出相同的结果?
制作sql的人认为区别很重要,所以他们写这篇文章以区别对待2个案例.
维基百科页面上有一篇相当不错的文章 - http://en.wikipedia.org/wiki/Null_%28SQL%29
| 归档时间: |
|
| 查看次数: |
203 次 |
| 最近记录: |