5

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

每个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
4

3 回答 3

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

于 2012-09-07T11:07:59.877 回答
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   
于 2012-09-07T11:21:09.163 回答
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
于 2012-09-07T11:17:33.320 回答