lnnvl(a) 函数

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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值