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)
这是因为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)
| 归档时间: |
|
| 查看次数: |
952 次 |
| 最近记录: |