【问题标题】:In how many languages is Null not equal to anything not even Null?在多少种语言中,Null 不等于任何不等于 Null 的东西?
【发布时间】:2024-01-29 09:20:01
【问题描述】:

在多少种语言中,Null 不等于任何不等于 Null 的东西?

【问题讨论】:

  • 不是一种语言,但浮点 NaN 也不等于它自己。

标签: sql ruby oracle language-agnostic vb6


【解决方案1】:

您可以让 ruby​​ 以这种方式工作:

class Null
 def self.==(other);false;end
end
n=Null
print "Null equals nothing" if n!=Null

【讨论】:

  • @Hugh:嗯,有人可能会这么说,但它可能的,这意味着人们会这样做......这是好是坏是另一回事。跨度>
  • 在 ruby​​ 中,null 被称为 nil 并且 NULL 不会被定义给发布的代码。但是,完全可以通过键入以下内容来执行此处暗示的操作:class NilClass; def ==(o); false; end; end
  • 哇@ormuriauga - 你发现了一个 2 岁的错字。固定的。现在它确实创建了一个不等于自身的Null,正如问题所问的那样。
【解决方案2】:

在 C# 中,Nullable 具有关于逻辑运算符的有趣属性,但相等运算符与该语言中的其他类型相同(即 ((bool?)null == (bool?)null) = = 真)。

为了保持短路逻辑运算符的short-circuited 行为,并保持与非短路逻辑运算符的一致性,可为空的布尔值具有一些有趣的属性。例如:真 ||空==真。 false && null == false 等。这与其他三值逻辑语言如ANSI SQL 直接矛盾。

【讨论】:

【解决方案3】:

在 SQL 中,您必须执行以下操作:

WHERE column is NULL

而不是

WHERE column = NULL

【讨论】:

    【解决方案4】:

    在 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有点反感。

    【讨论】:

    【解决方案5】:

    MySQL 有一个 null 安全的相等运算符 ,如果两边相等或两边都为 null,则返回 true。见MySQL Docs

    【讨论】:

    • +1 很有趣,但这应该是对 SQL 答案的评论
    【解决方案6】:

    在 SQL(作为一种逻辑语言)中是这样的,因为 null 表示未知/未定义。

    但是,在编程语言(例如 C++ 或 C#)中,空指针/引用是具有特定含义的特定值 - 没有。

    两个虚无是等价的,但两个未知不是。混淆来自于两个概念使用相同的名称(null)这一事实。

    【讨论】:

    【解决方案7】:

    Oracle 就是这样。

    SELECT * FROM dual WHERE NULL=null;  --no rows returned
    

    【讨论】:

    • 其实这是一般SQL的属性,不是Oracle特有的。
    最近更新 更多