在SQL中,为什么10 / NULL计算为NULL(或未知)?示例:
if((10/NULL) is NULL)
DBMS_OUTPUT.PUT_LINE("Null.");
但是,1 = NULL
作为比较被视为FALSE。不应该认为10 / NULL为FALSE吗?
我指的只是SQL。特别是没有任何DBMS。它可能是重复但我不知道在搜索此查询时要放置哪些关键字。
答案 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:
当SET ANSI_NULLS为ON时,具有一个或两个NULL表达式的运算符返回UNKNOWN
除非在特定函数或运算符的文档中另有说明,否则包含NULL的表达式始终会生成NULL值
如果任一操作数可以为null,则结果可以为null,如果其中一个为null,则结果为空值
不幸的是我在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)
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