为什么null <>"something"返回false

Bri*_*haw 1 sql plsql oracle11g

当我遇到一些让我对NULL值感到惊讶的事情时,我正在调试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;
Run Code Online (Sandbox Code Playgroud)

Ton*_*ews 8

这是因为SQL使用三值逻辑(3VL):有TRUE,有FALSE,有NULL(未知,既不是TRUE也不是FALSE).

表达式的结果vNullVariable <> vVariable在3VL中为NULL,而不是TRUE,因为它认为vNullVariable的值是未知的:如果稍后它变为已知值,它可能是'Hi'或者它可能不是,但是现在SQL不知道所以它返回NULL(未知).

所以IF表达式的计算结果为NULL,而不是TRUE,因此取而代之的是默认的ELSE路径 - 因为IF的逻辑是:

IF <expression is true> THEN
   ...
ELSE -- ie. if expression is FALSE or NULL
   ...
END IF;
Run Code Online (Sandbox Code Playgroud)

这意味着如果您以相反的方式编写检查,您获得您期望的行为:

IF vNullVariable = vVariable THEN
    dbms_output.put_line( 'The variables are equal' );
ELSE
    dbms_output.put_line( 'The variables are not equal' );
END IF;
Run Code Online (Sandbox Code Playgroud)