二、空值的测试
因为空值表示缺少数据,所以空值和其它值没有可比性,即不能用等于、不等于、大于或小于和其它数值比较,当然也包括空值本身(但是在decode中例外,两个空值被认为是等价)。测试空值只能用比较操作符ISNULL和ISNOTNULL。如果使用带有其它比较操作符的条件表达式,并且其结果依赖于空值,那么其结果必定是NULL。在where条件中,Oracle认为结果为NULL的条件为 FALSE,带有这样条件的select语句不返回行,也不返回错误信息。
例如查询EMP表中MGR为NULL的行:
SQL >select * from emp where mgr='';
no rows selected
SQL >select * from emp where mgr=null;
no rows selected
SQL >select * from emp where mgr is null;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
-- - - - -
7839 KING PRESIDENT 17-NOV-81 5000 10
第1、2句写法不妥,WHERE条件结果为NULL,不返回行。第三句正确,返回MGR为空值的行。
三、空值和操作符
1.空值和逻辑操作符
逻辑操作符
表达式
结果
AND
NULL AND TRUE
NULL
NULL AND FALSE
FALSE
NULL AND NULL
NULL
OR
NULL OR TRUE
TRUE
NULL OR FALSE
NULL
NULL OR NULL
NULL
NOT
NOT NULL
NULL
可以看到,在真值表中,除NULLANDFALSE结果为FALSE、NULLORTRUE结果为TRUE以外,其它结果均为NULL。
虽然在where条件中,Oracle认为结果为NULL的WHERE条件为FALSE,但在条件表达式中NULL不同于FALSE。例如在NOT(NULLANDFALSE)和NOT(NULLANDNULL)二者中仅有一处FALSE和 TRUE的区别,但NOT(NULLANDFALSE)的结果为TRUE,而NOT(NULLANDNULL)的结果为NULL。
下面举例说明空值和逻辑操作符的用法:
SQL > select * from emp where not comm=null and comm!=0;
no rows selected
SQL > select * from emp where not ( not comm=null and comm!=0 );
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
-- - - - -
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
第一个Select语句,条件"notcomm=nullandcomm!=0"等价于 NULLANDCOMM!=0。对于任意一行,如果COMM为不等于0的数值,条件等价于NULLANDTRUE,结果为NULL;如果COMM等于0,条件等价于NULLANDFALSE,结果为FALSE。所以,最终结果不返回行。
第二个Select语句的条件为第一个Select语句条件的"非"(NOT),对于任意一行,如果COMM为不等于0的数值,条件等价于NOTNULL,结果为NULL;如果COMM等于0,条件等价于NOTFALSE,结果为TRUE。所以,最终结果返回行COMM等于0的行。
