表:
aa   bb  
1   1,2 
2    3
3   5,6,7
我想显示为:
aa   bb  
1    1 
1    2
2    3
3    5
3    6
3    7

解决方案 »

  1.   

    SQL> select * from t1;        AA BB
    ---------- ----------
             1 1,2
             2 3
             3 5,6,7SQL> select aa, substrb(','||bb, instrb(','||bb,',',1,rr)+1, instrb(','||bb||',',',',1,rr+1)-instrb(','||bb,',',1,rr)-1)
      2      from t1,(select rownum rr from all_objects where rownum<1000)
      3      where instrb(','||bb,',',1,rr)>0
      4      order by aa,rr;        AA SUBSTRB(','
    ---------- -----------
             1 1
             1 2
             2 3
             3 5
             3 6
             3 7已选择6行。
      

  2.   

    1楼的错了,
    SQL> select   aa,
      2             substrb( ', '||bb,   instrb( ', '||bb, ', ',1,rr)+1,
      3             instrb( ', '||bb|| ', ', ', ',1,rr+1)-instrb( ', '||bb, ', ',1,rr)-1)
      4   from   tt,(select   rownum   rr   from   all_objects   where   rownum <1000)
      5   where   instrb( ', '||bb, ', ',1,rr)> 0
      6   order   by   aa,rr
      7  /        AA SUBSTRB(','||BB,INSTRB(','||BB
    ---------- ------------------------------
             1  1,2
             2  3
             3  5,6,7结果正在进行中...........
      

  3.   

    用游标可以实现 给你一个例子,希望能给你帮助:
    使用PLSQL实现在一条记录中以特定分隔符隔离的数据进行字符串拆分。T_ALLDEV表中的字段ALLDODEV中内容为“AAA,BB,CCC,DD,E”,T_ROUTDEF表中与该表数据一一对应,需要使用SEQID字段的内容,将ALLDODEV内容进行字符串拆分后,分成多条记录,插入T_SepDev表中。具体代码见详细内容。  DECLARE  
    CURSOR c_Tool IS --定义游标  
    SELECT T.PARTID,   
    T.ALLDODEV,   
    T.PRIDEV  
    FROM T_AllDev T;  
    rowCurTool c_Tool%rowtype;  
    iSeqid number;  
    vAllDev varchar2(255); --全标识字符串  
    vPriDev varchar2(255); --首选代码  
    iLength number;  
    iTimes number; --包含的个数  
    iCur number; --当前是第几个  
    vCurDev varchar2(255); --当前  
    vIsFirst varchar2(1); --是否首选  
    iSubLength number;   
    BEGIN  
    OPEN c_Tool;   
    FETCH c_Tool into rowCurTool;   
    while c_Tool%found loop   
    SELECT F.SEQID   
    into iSeqid  
    FROM T_ROUTDEF F  
    WHERE F.PRTNO = rowCurTool.PARTID;   
    vAllDev := rowCurTool.ALLDODEV;   
    vPriDev := rowCurTool.PRIDEV;  
    iLength := length(vAllDev);  
    select length(vAllDev)-length(replace(vAllDev,’,’,null)) into iTimes from dual; --计算其中包含的个数  
    iTimes := iTimes+1;  
    iCur := 1;  
    iSubLength := 1;  
    while iCur <= iTimes loop  
    vCurDev := substr(vAllDev,1,instr(vAllDev,’,’,1,1));   
    if iCur = iTimes then  
    iSubLength := 0;  
    else  
    iSubLength := length(vCurDev);   
    end if;  
    vAllDev := substr(vAllDev,iSubLength+1);  
    if iCur = iTimes then   
    vCurDev := vAllDev;  
    else  
    vCurDev := substr(vCurDev,1,length(vCurDev)-1);  
    end if;  
    IF vCurDev = vPriDev THEN   
    vIsFirst := ’1’;  
    ELSE  
    vIsFirst := ’0’;   
    END IF;  
    INSERT INTO T_SepDev(SEQID,   
    RESCODE,   
    ISFIRST)   
    VALUES(iSeqid,  
    vCurDev,   
    vIsFirst);  
    iCur := iCur + 1;  
    end loop;   
    FETCH c_Tool into rowCurTool;   
    end loop;   
    CLOSE c_Tool;   
    END;