Sql 为什么null“something”返回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

我在调试oracle数据库中的一个过程时,遇到了一些关于空值的问题,这让我很吃惊。有人能解释为什么下面的查询在这里为非相等检查返回false吗

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,那么。。。