我想通过拆分列值从一列插入多行。但是由于性能问题,我必须在没有游标的情况下这样做。
每个value
被分割为6个字符长度值。然后,这些值也会分成3个,1个和2个字符长度值,以在表B中插入不同的列。
我认为提供样本会澄清我的问题:
ID Value
1 ABCDEFGHJKLM
2 NOPRST
3 NULL VALUE
我想将这些值插入到表B中,就像这种格式
一样ID Value1 Value2 Value3
1 ABC D EF
1 GHJ K LM
2 NOP R ST
答案 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