4

在 SQL 中,为什么 10/NULL 评估为 NULL(或未知)?例子 :

if((10/NULL) is NULL)
    DBMS_OUTPUT.PUT_LINE("Null.");

然而,1 = NULL作为一个比较被认为是错误的。不应该 10/NULL 也被视为 FALSE 吗?

我指的只是 SQL。特别不是任何 DBMS。它可能是重复的,但我不知道在搜索这个查询时要输入什么关键字。

4

4 回答 4

7

不应该将 10/NULL 也视为 FALSE 吗?

没有为什么:

任何包含 null 的算术表达式的计算结果始终为 null。例如,null 添加到 10 为 null。事实上,当给定一个空操作数时,所有运算符(连接除外)都返回空。

强调我的,取自 Oracle 手册:http ://docs.oracle.com/cd/E11882_01/server.112/e26088/sql_elements005.htm#i59110

这是 SQL 标准所要求的。

编辑,因为问题一般是针对 RDBMS 的:

SQL 服务器

当 SET ANSI_NULLS 为 ON 时,具有一个或两个 NULL 表达式的运算符返回 UNKNOWN

链接到手册

MySQL

除非特定函数或运算符的文档中另有说明,否则包含 NULL 的表达式始终生成 NULL 值

链接到手册

DB2

如果任一操作数可以为空,则结果可以为空,如果任一操作数为空,则结果为空值

链接到手册

PostgreSQL

不幸的是,我在 PostgreSQL 手册中找不到这样一个明确的声明,尽管我确信它的行为是一样的。


警告:“(连接除外)”仅是 Oracle 的非标准异常。(空字符串和 NULL 在 Oracle 中几乎相同)。连接空值在所有其他 DBMS 中给出空值。

于 2012-09-24T12:36:00.923 回答
1

1 = null 不为 null。它实际上是未知的。以及任何其他空操作。

于 2012-09-24T12:30:27.947 回答
1

相等谓词的1 = NULL计算结果为 NULL。但NULL在布尔比较中被认为是错误的。

如果您执行类似NOT( 1 = NULL ),1 = NULL评估为NULL,NOT( NULL )评估为NULL等的操作,则整个条件最终评估为假。

Oracle 在其文档中有一节介绍在比较和条件语句中处理 NULL 值——其他数据库将以非常相似的方式处理事情。

于 2012-09-24T12:32:11.753 回答
0

10/something 表示您正在计算 10 中将有多少“某物”,在这种情况下,您正在计算 10 中将有多少“无” - 那是无穷大,未知.. 1 = NULL 是错误的,因为一个不等于没有

NULLIF 函数接受两个参数。如果第一个参数等于第二个参数,NULLIF 返回 Null。否则,返回第一个参数的值。NULLIF(值 1,值 2)

NVL NVL 函数接受两个参数。它返回第一个非 NULL 参数,如果所有参数都为 NULL,则返回 NULL。

还要检查这个条件结果:

这个“null 等于 UNKNOWN 真值”命题在 SQL 3VL 中引入了不一致。一个主要问题是它与 null 的基本属性(传播属性)相矛盾。根据定义,空值通过所有 SQL 表达式传播。布尔真值不具有此属性。考虑 SQL:1999 中的以下场景,其中两个布尔真值组合成一个复合谓词。根据 SQL 3VL 的规则,如本文前面所示的 3VL 真值表所示,以下语句成立:

(对或未知)→ 对

(假和未知)→假

但是,由于 null 传播,将 null 视为 UNKNOWN 会导致 SQL 3VL 中出现以下逻辑不一致:

(真或空)→空(=未知)

(假和空)→空(=未知)

SQL:1999 标准没有定义如何处理这种不一致,结果可能因实现而异。由于这些不一致和缺乏供应商的支持,SQL 布尔数据类型没有得到广泛接受。大多数 SQL DBMS 平台现在都为存储布尔类型数据提供了自己的特定于平台的建议。请注意,在 SQL 的 PostgreSQL 实现中,null 值用于表示所有 UNKNOWN 结果,并且会发生以下评估:

(真或空)→真

(假和空)→假

(假或空)是空→真

(真和空)是空→真

于 2012-09-24T12:39:17.227 回答