我在读这篇文章: Get null == null in SQL

大家一致认为,在try 测试两个(可为空的)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吗?

EDIT

假设A或B都可以为空,用来判断它们的不等式是否足够

where (A<>B)

或者我需要像这样明确地判断它:

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

有关此问题的答案,请参阅此thread.

推荐答案

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

edit

这里,<>代表任意二进制运算符,NULL代表SQL占位符,value代表任意值(NULL代表not a值):

  • NULL <> value -> NULL
  • NULL <> NULL -> NULL

逻辑是:NULL表示"无值"或"未知值",因此与任何实际value进行任何比较都毫无意义.

如果你不知道X的值(如果any)是多少,那么X = 42是真的、假的还是未知的?SQL表示这是未知的.考虑到两者都未知,X = Y是真的、假的还是未知的?SQL表示结果是unknown.对于任何二进制关系操作都是如此,这只是逻辑上的(即使模型中没有空值).

SQL还提供了两个unary后缀运算符IS NULLIS NOT NULL,它们根据操作数返回TRUE或FALSE.

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

Database相关问答推荐

找不到复制副本集

为什么Hibernate会为@JoinTable的双向@OneToMany关系生成一个复杂的子查询?

将光标中找到的值输出到logcat?

什么是hibernate annotated类中使用的 catalog?

数据库设计:多表与单表

递归关系的数据库设计

SQL Server 中的Is Identity列属性是什么意思?

如何识别 DB2 端口号

为什么 DynamoDB 查询中没有**not equal**比较?

如何处理这个错误(1049,未知数据库'/users/ohyunjun/work/astral/mysql')

MySQL:LAST_INSERT_ID() 返回 0

A QuerySet 按聚合字段值

EF4 代码优先导致 InvalidOperationException

数据完整性和数据一致性之间有什么区别吗?

如何从数据库中解析时间

如何一次插入1000行

MongoDB 是否支持浮点类型?

使用 Django 的复合/复合主/唯一键

不同类型的SQL之间的区别?

无需安装的轻量级 SQL 数据库