为什么10 / NULL计算为null?

时间:2012-09-24 12:28:22

标签: sql rdbms

在SQL中,为什么10 / NULL计算为NULL(或未知)?示例:

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

但是,1 = NULL作为比较被视为FALSE。不应该认为10 / NULL为FALSE吗?

我指的只是SQL。特别是没有任何DBMS。它可能是重复但我不知道在搜索此查询时要放置哪些关键字。

4 个答案:

答案 0 :(得分:6)

  

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

不,因为:

  

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

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

这是SQL标准所要求的。

编辑,因为问题通常是RDBMS:

SQL Server

  

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

Link to the the manual

的MySQL

  

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

Link to the manual

DB2

  

如果任一操作数可以为null,则结果可以为null,如果其中一个为null,则结果为空值

Link to the manual

的PostgreSQL

不幸的是我在PostgreSQL手册中找不到这样一个明确的声明,虽然我确定它的行为相同。


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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

等式谓词1 = NULL的计算结果为NULL。但是布尔比较中的NULL被认为是假的。

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

Oracle在handling NULL values in comparisons and conditional statements的文档中有一节 - 其他数据库将以非常类似的方式处理事情。

答案 3 :(得分:0)

10 /某意味着你在计算10中会有多少“某事” 在这种情况下,你要计算10中“没有”的数量 - 这是无限的,未知的...... 1 = NULL为假,因为一个不等于

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

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

还要检查这个有条件的结果:

这个“null等于UNKNOWN真值”命题引入了SQL 3VL的不一致性。一个主要问题是它与零点的基本属性(传播特性)相矛盾。根据定义,Null在所有SQL表达式中传播。布尔值列表没有此属性。请考虑SQL中的以下场景:1999,其中两个布尔实例值组合成复合谓词。根据SQL 3VL的规则,如本文前面所示的3VL真值表所示,以下陈述包含:

(TRUE OR UNKNOWN)→TRUE

(FALSE AND UNKNOWN)→FALSE

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

(TRUE OR NULL)→NULL(= UNKNOWN)

(FALSE AND NULL)→NULL(= UNKNOWN)

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

(TRUE OR NULL)→TRUE

(FALSE AND NULL)→FALSE

(FALSE OR NULL)为NULL→TRUE

(TRUE AND NULL)IS NULL→TRUE