【发布时间】:2024-01-29 09:20:01
【问题描述】:
在多少种语言中,Null 不等于任何不等于 Null 的东西?
【问题讨论】:
-
不是一种语言,但浮点 NaN 也不等于它自己。
标签: sql ruby oracle language-agnostic vb6
在多少种语言中,Null 不等于任何不等于 Null 的东西?
【问题讨论】:
标签: sql ruby oracle language-agnostic vb6
您可以让 ruby 以这种方式工作:
class Null
def self.==(other);false;end
end
n=Null
print "Null equals nothing" if n!=Null
【讨论】:
class NilClass; def ==(o); false; end; end
Null,正如问题所问的那样。
在 C# 中,Nullable
为了保持短路逻辑运算符的short-circuited 行为,并保持与非短路逻辑运算符的一致性,可为空的布尔值具有一些有趣的属性。例如:真 ||空==真。 false && null == false 等。这与其他三值逻辑语言如ANSI SQL 直接矛盾。
【讨论】:
x==y 为真,但x<=y 为假。这似乎很难辩护。 msmvps.com/blogs/bill/archive/2007/09/07/c-defies-logic.aspx
在 SQL 中,您必须执行以下操作:
WHERE column is NULL
而不是
WHERE column = NULL
【讨论】:
在 VB6 中,表达式 Null = Null 将产生 Null 而不是您所期望的 True。
如果您尝试将其分配给布尔值,这将导致运行时错误,但是如果您使用它
作为“If ... Then”的条件,它的行为类似于False。而且Null <> Null会也
产生Null,所以:
在 VB6 中,您可以说 Null 既不等于自身(或其他任何东西),也不等于!
您应该使用IsNull() 函数对其进行测试。
VB6还有其他特殊的价值:
Nothing 用于对象引用。 Nothing = Nothing 是编译错误。 (您应该使用“is”进行比较)Missing 用于未给出的可选参数。它没有文字表示,所以你甚至不能写Missing = Missing。 (测试是IsMissing(foo))Empty 用于未初始化的变量。虽然有也一个函数IsEmpty(),但这个确实测试等于它自己。我记得我对VB有点反感。
【讨论】:
MySQL 有一个 null 安全的相等运算符 ,如果两边相等或两边都为 null,则返回 true。见MySQL Docs。
【讨论】:
在 SQL(作为一种逻辑语言)中是这样的,因为 null 表示未知/未定义。
但是,在编程语言(例如 C++ 或 C#)中,空指针/引用是具有特定含义的特定值 - 没有。
两个虚无是等价的,但两个未知不是。混淆来自于两个概念使用相同的名称(null)这一事实。
【讨论】:
Oracle 就是这样。
SELECT * FROM dual WHERE NULL=null; --no rows returned
【讨论】: