将不同列的数据合并到oracle中的特定列中

时间:2013-07-24 20:55:22

标签: sql oracle

我的结果集如下:

Name number reg_type1 reg_type2 reg_type3 reg_type4 reg_type5 reg_type6 reg_type7
aaa   123       Y         N       Y          N          Y       N         N
bbb   234       N         N       Y          N          Y       N         N
ccc   456       Y         N       Y          Y          N       Y         Y

我希望结果集如下:

Name   number      level1       level2        level3      level4      level5 
aaa     123       reg_type1    reg_type3     reg_type5    NULL         NULL
bbb     234       reg_type3    reg_type5        NULL      NULL         NULL
ccc     456       reg_type1    reg_type3     reg_type4    reg_type6   reg_type7

任何人都可以帮助我!!

谢谢!

1 个答案:

答案 0 :(得分:3)

如果您愿意将它们放在一列而不是单独的列中,那么代码非常简单:

select name, number,
       ((case when reg_type1 = 'Y' then 'reg_type1 ' else '' end) ||
        (case when reg_type2 = 'Y' then 'reg_type2 ' else '' end) ||
        (case when reg_type3 = 'Y' then 'reg_type3 ' else '' end) ||
        (case when reg_type4 = 'Y' then 'reg_type4 ' else '' end) ||
        (case when reg_type5 = 'Y' then 'reg_type5 ' else '' end) ||
        (case when reg_type6 = 'Y' then 'reg_type6 ' else '' end) ||
        (case when reg_type7 = 'Y' then 'reg_type7 ' else '' end)
       )
from t;

如果你真的想要它们在不同的列中,你可以这样做:

select name, number,
       substr(regtypes, 1, 10) as level1,
       substr(regtypes, 11, 10) as level2,
       substr(regtypes, 21, 10) as level3,
       substr(regtypes, 31, 10) as level4,
       substr(regtypes, 41, 10) as level5,
       substr(regtypes, 51, 10) as level6,
       substr(regtypes, 61, 10) as level7
from (select name, number,
             ((case when reg_type1 = 'Y' then 'reg_type1 ' else '' end) ||
              (case when reg_type2 = 'Y' then 'reg_type2 ' else '' end) ||
              (case when reg_type3 = 'Y' then 'reg_type3 ' else '' end) ||
              (case when reg_type4 = 'Y' then 'reg_type4 ' else '' end) ||
              (case when reg_type5 = 'Y' then 'reg_type5 ' else '' end) ||
              (case when reg_type6 = 'Y' then 'reg_type6 ' else '' end) ||
              (case when reg_type7 = 'Y' then 'reg_type7 ' else '' end)
             ) as regtypes
      from t
     ) t

此版本假设所有值的长度均为9,并且它们之间有空格。