如何从一列插入多行?

时间:2012-09-07 10:56:52

标签: sql database oracle insert

我想通过拆分列值从一列插入多行。但是由于性能问题,我必须在没有游标的情况下这样做。

每个value被分割为6个字符长度值。然后,这些值也会分成3个,1个和2个字符长度值,以在表B中插入不同的列。

我认为提供样本会澄清我的问题:

表A

ID      Value
1       ABCDEFGHJKLM
2       NOPRST
3       NULL VALUE

我想将这些值插入到表B中,就像这种格式

一样

表B

ID     Value1       Value2       Value3
1       ABC          D            EF
1       GHJ          K            LM
2       NOP          R            ST

3 个答案:

答案 0 :(得分:6)

假设600(100行)为最大值:

insert into tableB
select id, substr(value,n*6+1,3), substr(value,n*6+4,1), substr(value,n*6+5,2)
from tableA 
     join (select level-1 as n from dual connect by level <= 100)
       on length(value) > n*6;

请参阅Sqlfiddle

答案 1 :(得分:3)

select ID,
    SUBSTR(value,number*6+1,3),
    SUBSTR(value,number*6+4,1),
    SUBSTR(value,number*6+5,2)
from yourtable,
    (select 0  as number union select 1 union select 2 union select 3 union select 4 
            union  select 5 union select 6) as numbers 
      /* etc up to the max length of your string /6 */
where LEN(value)>number*6   

答案 2 :(得分:0)

试试这个:

请将其转换为ORACLE SQL .. 尽管如此,它使用while循环,它进行批量插入......并且循环按照表中最大值的长度执行

declare @max_len int=0;
declare @counter int=0;
declare @col_index int=1;
select @max_len=MAX(len(Value)) from TableA

while (@max_len/6 > @counter)
begin
    set @counter=@counter+1

    Insert into TableB

    select ID,substring(Value,@col_index,3),
              substring(Value,@col_index+3,1),
              substring(Value,@col_index+4,2) 
    from TableA where substring(Value,@col_index,3) is not null

    set @col_index=@col_index+6
end