Oracle数据压缩向上推送数据

时间:2015-08-21 17:32:43

标签: sql compression

我需要查询,表格中有5列

select pos1,pos2,pos3,pos4,pos5 from ci_pos ;

在上面的字段中,任何两个都可以为null

例如

pos1='hyd'
pos2='blr'
pos3=null
pos4=null
pos5='Chn'

或其他例子

pos1='hyd'
pos2=null
pos3='blr'
pos4=null
pos5='chn'

pos1=null
pos2='hyd'
pos3='blr'
pos4=null
pos5='chn'

等所有上述情况。

我需要编写一个select查询,它将返回如下输出

示例:

pos1='hyd'
pos2='blr'
pos3=null
pos4=null
pos5='chn'

o / p应该是:

pos1='hyd'
pos2='blr'
pos3='Hyd'
pos4=null
pos5=null

示例2:

pos1='hyd'
pos2=null
pos3='blr'
pos4=null
pos5='chn'

输出

pos1='hyd'
pos2='blr'
pos3='chn'
pos4=null
pos5=null'

基本上我需要将最后两列设为null并将数据推送到上面的列。

1 个答案:

答案 0 :(得分:0)

这可以通过 COALESCE 轻松实现,Oracle函数返回其第一个不是 NULL 的参数。如果您确定5列中只有2列 NULL ,那么以下代码将为您提供所需的输出:

with
  test_data as (
    select 'hyd' as pos1,
           'blr' as pos2,
            null as pos3,
            null as pos4,
            'chn' as pos5
      from dual
    union
    select null as pos1,
           null as pos2,
           'hyd' as pos3,
           'blr' as pos4,
           'chn' as pos5
      from dual
    union
    select 'hyd' as pos1,
           null as pos2,
           'blr' as pos3,
           null as pos4,
           'chn' as pos5
      from dual)
select
    coalesce(pos1, pos2, pos3, pos4, pos5) as pos1,
    case
      when pos1 is not null then coalesce(pos2, pos3, pos4)
      when pos1 is null and pos2 is not null then nvl(pos3, pos4)
      else pos4
    end as pos2,
    coalesce(pos5, pos4, pos3, pos2, pos1) as pos3,
    null as pos4,
    null as pos5
  from test_data
;

说明:我们知道最后两列将是 NULL ,所以我们只返回 NULLs 。第一列和第二列很简单 - 只需获取第一列(pos1)的第一个非 NULL 值。对于第三列也是如此,但是按照检查列的相反顺序。

只有第二列需要进行一些检查 - 如果第一列不是 NULL ,那么最后一个值将位于pos2,pos3或pos4中。如果pos1 NULL ,而第二列不是,那么中间值将是pos3或pos4。否则,pos2值在pos4列中。

输出:

POS1 POS2 POS3 POS4 POS5
---- ---- ---- ---- ----
hyd  blr  chn           
hyd  blr  chn           
hyd  blr  chn           

SQLFiddle Example