2013-02-20 66 views
0

使用Oracle11g:如何防止空值的算術?

如果列爲空,我想排除列上的算術。

在這種情況下,我怎麼能得到lag_diff的SeqNo = 1

with detail_records as (
    select 1 seqno, 10 set_a from dual union all 
    select 2 seqno, 10 set_a from dual union all 
    select 3 seqno, 20 set_a from dual union all 
    select 4 seqno, 30 set_a from dual) 
    select seqno, 
      set_a, 
      lag_val, 
    case (lag_val - set_a) 
    when 0 then 'AAA' 
    else 'BBB' 
    end as lag_diff 
from (select seqno, 
     set_a, 
     lag(set_a,1) over (order by seqno) as lag_val  
    from detail_records) 
order by seqno 

預期的效果

SEQNO SET_A LAG_VAL LAG_DIFF 
    ---------------------------- 
    1  10 <NULL> <null> 
    2  10 10  AAA 
    3  20 10  BBB 
    4  30 20  BBB 

回答

2

改變你的情況爲以下內容:

with detail_records as (
    select 1 seqno, 10 set_a from dual union all 
    select 2 seqno, 10 set_a from dual union all 
    select 3 seqno, 20 set_a from dual union all 
    select 4 seqno, 30 set_a from dual) 
    select seqno, 
      set_a, 
      lag_val, 
    case 
    when (lag_val - set_a) is null then null 
    when (lag_val - set_a) = 0 then 'AAA' 
    else 'BBB' 
    end as lag_diff 
from (select seqno, 
     set_a, 
     lag(set_a,1) over (order by seqno) as lag_val  
    from detail_records) 
order by seqno