Sql 为什么null“something”返回false
我在调试oracle数据库中的一个过程时,遇到了一些关于空值的问题,这让我很吃惊。有人能解释为什么下面的查询在这里为非相等检查返回false吗Sql 为什么null“something”返回false,sql,plsql,oracle11g,Sql,Plsql,Oracle11g,我在调试oracle数据库中的一个过程时,遇到了一些关于空值的问题,这让我很吃惊。有人能解释为什么下面的查询在这里为非相等检查返回false吗 DECLARE vNullVariable VARCHAR2(2) := NULL; vVariable VARCHAR2(2) := 'Hi'; BEGIN IF vNullVariable <> vVariable THEN dbms_output.put_line( 'The variables
DECLARE
vNullVariable VARCHAR2(2) := NULL;
vVariable VARCHAR2(2) := 'Hi';
BEGIN
IF vNullVariable <> vVariable THEN
dbms_output.put_line( 'The variables are not equal' );
ELSE
dbms_output.put_line( 'The variables are equal' );
END IF;
END;
这是因为SQL使用三值逻辑3VL:存在TRUE、FALSE和NULL unknown,既不存在TRUE也不存在FALSE 表达式vNullVariable vVariable的结果在3VL中为NULL,而不是TRUE,因为它认为vNullVariable的值是未知的:如果以后它成为已知值,它可能是“Hi”,也可能不是,但现在SQL不知道,所以它返回NULL unknown 因此IF表达式的计算结果为NULL,而不是TRUE,因此采用默认的ELSE路径-因为逻辑IF为:
IF <expression is true> THEN
...
ELSE -- ie. if expression is FALSE or NULL
...
END IF;
这是因为SQL使用三值逻辑3VL:存在TRUE、FALSE和NULL unknown,既不存在TRUE也不存在FALSE 表达式vNullVariable vVariable的结果在3VL中为NULL,而不是TRUE,因为它认为vNullVariable的值是未知的:如果以后它成为已知值,它可能是“Hi”,也可能不是,但现在SQL不知道,所以它返回NULL unknown 因此IF表达式的计算结果为NULL,而不是TRUE,因此采用默认的ELSE路径-因为逻辑IF为:
IF <expression is true> THEN
...
ELSE -- ie. if expression is FALSE or NULL
...
END IF;
NULL在Oracle上有奇怪的行为。要将某物与null进行比较,最好使用is null而不是“=null” 你对这件事有很好的解释 在代码中,可以使用
IF vVariable IS NOT NULL THEN
NULL在Oracle上有奇怪的行为。要将某物与null进行比较,最好使用is null而不是“=null” 你对这件事有很好的解释 在代码中,可以使用
IF vVariable IS NOT NULL THEN
在Oracle中,NULL既不等于NULL,也不等于NULL。计算两个空值的比较条件将始终为FALSE。以下涉及NULL的条件将有效
1. IF vNullVariable is NULL THEN
2. IF vNullVariable is not NULL THEN
3. IF NVL(vNullVariable, -1) <> NVL(vVariable, -1) THEN -
This condition will give you expected result even if both vNullVariabl
and vVariable are NULLs
4. Oracle considers two nulls to be equal when evaluating a DECODE function
在Oracle中,NULL既不等于NULL,也不等于NULL。计算两个空值的比较条件将始终为FALSE。以下涉及NULL的条件将有效
1. IF vNullVariable is NULL THEN
2. IF vNullVariable is not NULL THEN
3. IF NVL(vNullVariable, -1) <> NVL(vVariable, -1) THEN -
This condition will give you expected result even if both vNullVariabl
and vVariable are NULLs
4. Oracle considers two nulls to be equal when evaluating a DECODE function
有没有标准的处理方法?我并不总是期望值为NULL,但无论哪种方式,我都希望IF块中的代码能够执行。我唯一能想到的就是添加一些东西,比如vNullVariable是NULL,vVariable不是NULL,反之亦然。和。你可以这样做,或者做=检查,而不是像我的更新中那样检查。有时人们使用nvl:如果是nvlv1,'XXX'nvlv2。'XXX'那么。。。。问题当然是您需要使用默认值,而这些默认值实际上不能是真正的非空值+1提到NULL是未知的,所以我们不能说它不等于'Hi'@Juergen:结果将是NULL不是FALSE,但你有一点-它将落入用户期望的ELSE中。在这种情况下,我们必须开始使用,如果a为null,b为null或a=b,那么……有没有标准的处理方法?我并不总是期望值为NULL,但无论哪种方式,我都希望IF块中的代码能够执行。我唯一能想到的就是添加一些东西,比如vNullVariable是NULL,vVariable不是NULL,反之亦然。和。你可以这样做,或者做=检查,而不是像我的更新中那样检查。有时人们使用nvl:如果是nvlv1,'XXX'nvlv2。'XXX'那么。。。。问题当然是您需要使用默认值,而这些默认值实际上不能是真正的非空值+1提到NULL是未知的,所以我们不能说它不等于'Hi'@Juergen:结果将是NULL不是FALSE,但你有一点-它将落入用户期望的ELSE中。在这种情况下,我们必须开始使用,如果a为null,b为null或a=b,那么。。。