当前位置: 首页 > 面试题库 >

为什么null不等于null false

葛霄
2023-03-14
问题内容

我正在阅读本文: 在SQL中获取null == null

共识是,当尝试测试两个(可空)sql列之间的相等性时,正确的方法是:

where ((A=B) OR (A IS NULL AND B IS NULL))

当A和B为NULL时,(A = B)仍返回FALSE,因为NULL不等于NULL。这就是为什么需要额外检查的原因。

检验不平等情况如何?经过以上讨论,我认为要测试不平等,我需要做一些类似的事情:

WHERE ((A <> B) OR (A IS NOT NULL AND B IS NULL) OR (A IS NULL AND B IS NOT NULL))

但是,我注意到这不是必需的(至少在informix 11.5上没有),我可以这样做:

where (A<>B)

如果A和B为NULL,则返回FALSE。如果NULL不等于NULL,那么这不应该返回TRUE吗?

编辑
这些都是很好的答案,但我认为我的问题有点含糊。请允许我改写:

假设A或B可以为NULL,是否足以用来检查它们的不等式

where (A<>B)

还是我需要像这样显式检查它:

WHERE ((A <> B) OR (A IS NOT NULL AND B IS NULL) OR (A IS NULL AND B IS NOT NULL))

问题答案:

涉及NULL的关系表达式实际上再次产生NULL

编辑

在这里,<>代表任意的二进制运算符,NULL是SQL占位符,value是任何值(NULL是不是一个值):

NULL <> value -> NULL
NULL <> NULL -> NULL
逻辑是:NULL表示“无值”或“未知值”,因此与任何实际值的任何比较都是没有意义的。

X = 42假设您不知道拥有什么值(如果有),它是true,false还是未知X?SQL表示未知。X = Y假设两者都是未知的,则为真,假或未知?SQL说结果未知。它对任何二元关系操作都是如此,这只是逻辑上的(即使模型中的NULL不在首位)。

SQL还提供了两个一元后缀运算符IS NULL和IS NOT NULL,它们根据其操作数返回TRUE或FALSE。

NULL IS NULL -> TRUE
NULL IS NOT NULL -> FALSE



 类似资料:
  • 让我澄清一下我的问题,OnCreate方法用于初始化视图并展平布局,因此我认为,如果OnCreate方法在一切之前运行,意味着我的EditText字段为空意味着为空,那么这个条件是如何工作的。但它运行良好,这意味着我理解错误。请告诉我我错过了什么。 代码片段取自google codelabs,我们在那里提供电话号码。在editText中,通过点击设备内置键盘上的发送按钮,我们启动电话应用程序来拨打

  • 问题内容: 我在ColdFusion代码中碰巧遇到了这些值,但Google计算器似乎有相同的“错误”,但差不为零。 416582.2850-411476.8100-5105.475 = -2.36468622461E-011 http://www.google.com/search?hl=zh_CN&rlz=1C1GGLS_enUS340US340&q=416582.2850+-+411476.8

  • 问题内容: 有人可以解释一下SQL中的以下行为吗? 问题答案: 是标准SQL-92;是等效的。两者都评估值,但不是-是占位符,表示不存在值。 这就是为什么您只能在此类情况下使用/作为谓词的原因。 此行为不特定于SQL Server。所有符合标准的SQL方言都以相同的方式工作。 注意 :要比较如果您的 值不为null ,请使用,而要与 不为null 值进行比较,请使用。我不能说我的值是否等于NULL

  • 问题内容: 我必须编写一个例程,如果变量的类型为,则将变量的值加1,否则将变量的值分配为0,其中变量的初始值为或。 第一个实现是因为我认为没有数字会使算术表达式为假,但是由于计算为真,所以这是错误的。然后,我得知行为类似于0,并且以下表达式均被评估为true。 当然不是0。被评估为false。这使看似重言式的表达成为错误。 为什么实际上不是0,却像0? 问题答案: 您真正的问题似乎是: 为什么:

  • 我可以理解,在大小数中,2.0并不等于2.00,因为2.00实际上使用了更高精度的数字。我很难理解为什么不被认为等于,因为这两个数字实际上使用相同数量的精确数字。依我看,它们只是完全相同数字的不同表示。 我知道,我可以使用和而不是,我只是对这背后的推理感兴趣。有人能帮我理解吗?

  • 问题内容: 在我的Web应用程序中,我在Apache Tomcat(TomEE)/7.0.37服务器上使用OpenJPA。我使用Netbeans自动生成类(“来自数据库的实体类…”和“来自实体类的会话Bean …”)。在SessionBean(例如UserFacade)上,我想获取EntityManager: 但是当我通过上述方式得到它时,我得到的是空值。当我通过: ecm不为空,还可以 我的pe