SQL> set autotrace traceonly explain
SQL> select
2 t1.v1, t2.v1
3 from
4 t1,
5 t2
6 where
7 t2.join1 = t1.join1
8 or t2.join2 = t1.join2;
执行计划
----------------------------------------------------------
Plan hash value: 2367419095
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2125K| 56M| 249 (33)| 00:00:03 |
| 1 | CONCATENATION | | | | | |
|* 2 | HASH JOIN | | 2000K| 53M| 120 (30)| 00:00:02 |
| 3 | TABLE ACCESS FULL| T1 | 10000 | 136K| 43 (3)| 00:00:01 |
| 4 | TABLE ACCESS FULL| T2 | 10000 | 136K| 43 (3)| 00:00:01 |
|* 5 | HASH JOIN | | 125K| 3417K| 129 (35)| 00:00:02 |
| 6 | TABLE ACCESS FULL| T1 | 10000 | 136K| 43 (3)| 00:00:01 |
| 7 | TABLE ACCESS FULL| T2 | 10000 | 136K| 43 (3)| 00:00:01 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("T2"."JOIN2"="T1"."JOIN2")
5 - access("T2"."JOIN1"="T1"."JOIN1")
filter(LNNVL("T2"."JOIN2"="T1"."JOIN2"))
lnnvl(a)
a是一个表达式
lnnvl只能用于where子句中;表达式的操作符号不能包含 AND, OR, BETWEEN。
如果a的结果是false或者是unknown,那么lnnvl返回true;如果a的结果是true,返回false.
"如果a的结果是false或者是unknown,那么lnnvl返回true",这个很重要,因为一个空值或者unknown的值和另外一个常量或者有值的变量比较的时候,返回的总是unknown,所以
lnnvl(a>10) 等价于 nvl(a,0)<=10 等价于 a<=10 or a is null (假设a number(10))
说白了,lnnvl是一种特定的用于简化表达式的函数,orcle解析的时候,应该会解析为 "a<=10 or a is null".
Oracle select --lnnvl用于某个语句的where子句中的条件
lnnvl用于某个语句的where子句中的条件,如果条件为真就返回真,否则为假。
其含义可理解为LNNVL == IS NULL OR IS NOT TRUE
这样我们在下面的试验中使用的大于小于符号将会是返的,还要注意这个问题。
它的优势是可以处理简单条件判断无法实现的null条件
比如要查询一个学校的登记表中检索其毕业年份早于2010年的,并且包含那些还未填写年份而未null的记录。
create table testaaa(name varchar2(10),year number);
insert into testaaaa values('huangkp',2008);
insert into testaaaa values('wujw',2012 );
insert into testaaaa values('zhangle',null);
insert into testaaaa values('mxy',2007);
然后我们执行下面的代码
select * from testaaaa where lnnvl(year<2010) 意思就是找出year不小于2010的人员,返回的结果包括空值的。
结果为:
1 wujw 2012
2 zhangle
select * from testaaaa where lnnvl(year>2010) 意思就是找出year不大于2010的人员,返回的结果包括空值的。
结果为:
1 huangkp 2008
2 zhangle
3 mxy 2007
空值依然存在
select * from testaaaa where year>2010 找出year大于2010的人员,这个结果中就不包括空值了。
结果为
1 wujw 2012
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8102208/viewspace-667461/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/8102208/viewspace-667461/