2011-06-16 82 views
0

我有一个表,看起来像这样从一个行选择多个值

A 1,2 
B 3,4,5 

我想产生一个结果集,看起来像这样:

A 1 
A 2 
B 3 
B 4 
B 5 

是否有一个SQL语句那会做到这一点?我正在使用Oracle。

+0

我不明白你的表。逗号是什么意思?一个新的行?空间是什么意思? – Ariel 2011-06-16 09:29:44

+1

[将列拆分为多行]可能的重复(http://stackoverflow.com/questions/3713107/split-column-to-multiple-rows) – 2011-06-16 09:51:05

回答

1
create table foo (
    var1 varchar2(1), 
    var2 varchar2(15) 
); 
insert into foo (var1, var2) values ('A', '1,2'); 
insert into foo (var1, var2) values ('B', '3,4,5'); 
insert into foo (var1, var2) values ('C', '6'); 

-- This will work if you are using oracle 11g 
-- otherwise you will need to *guess* at the max number of rows 
select var1, var2 
    from (
     select var1 
      , substr(var2 
        , instr(var2, ',', 1, l.appearance)+1 
        , instr(var2, ',', 1, l.appearance+1) - instr(var2, ',', 1, l.appearance)-1) var2 
     from (select var1, ','||var2||',' var2 from foo) 
      , (select level appearance 
       from dual 
      connect by level - 1 <= (select max(regexp_count(var2, ',')) from foo)) l 
     ) 
    where var2 is not null 
order by var1, var2; 

-- This will work if you are using oracle 10g 
select var1, var2 
    from (
     select var1 
      , substr(var2 
        , instr(var2, ',', 1, l.appearance)+1 
        , instr(var2, ',', 1, l.appearance+1) - instr(var2, ',', 1, l.appearance)-1) var2 
     from (select var1, ','||var2||',' var2 from foo) 
      , (select level appearance 
       from dual 
      connect by level - 1 <= 99) l 
     ) 
    where var2 is not null 
order by var1, var2;