在 SQL 中,为什么 10/NULL 评估为 NULL(或未知)?例子 :
if((10/NULL) is NULL)
DBMS_OUTPUT.PUT_LINE("Null.");
然而,1 = NULL
作为一个比较被认为是错误的。不应该 10/NULL 也被视为 FALSE 吗?
我指的只是 SQL。特别不是任何 DBMS。它可能是重复的,但我不知道在搜索这个查询时要输入什么关键字。
不应该将 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 的:
当 SET ANSI_NULLS 为 ON 时,具有一个或两个 NULL 表达式的运算符返回 UNKNOWN
除非特定函数或运算符的文档中另有说明,否则包含 NULL 的表达式始终生成 NULL 值
如果任一操作数可以为空,则结果可以为空,如果任一操作数为空,则结果为空值
不幸的是,我在 PostgreSQL 手册中找不到这样一个明确的声明,尽管我确信它的行为是一样的。
警告:“(连接除外)”仅是 Oracle 的非标准异常。(空字符串和 NULL 在 Oracle 中几乎相同)。连接空值在所有其他 DBMS 中给出空值。
1 = null 不为 null。它实际上是未知的。以及任何其他空操作。
相等谓词的1 = NULL
计算结果为 NULL。但NULL
在布尔比较中被认为是错误的。
如果您执行类似NOT( 1 = NULL )
,1 = NULL
评估为NULL
,NOT( NULL )
评估为NULL
等的操作,则整个条件最终评估为假。
Oracle 在其文档中有一节介绍在比较和条件语句中处理 NULL 值——其他数据库将以非常相似的方式处理事情。
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 结果,并且会发生以下评估:
(真或空)→真
(假和空)→假
(假或空)是空→真
(真和空)是空→真