2016-08-09 112 views
2

我想將列中的值從一個表中插入另一個表中,但第一個表的值存儲在一個由逗號分隔的單個字符串中。 我必須自動插入所有值而不指定id,因此創建以下內容。從逗號分隔列表中插入拆分值

TABLE_1 

ID_TRA | COND 
------------ 
100 | 1,2,4 
101 | 4 
102 | 1, 16 <--- TRIM SPACE 

TABLE_2 
ID | ID_TRA | COND_ID 
--------------------- 
1 | 100 | 1 
2 | 100 | 2 
3 | 100 | 4 
4 | 101 | 4 
5 | 102 | 1 
6 | 102 | 16 

注意

需要,因爲它是被插入

+3

永遠不要將數據存儲爲逗號分隔值。這隻會導致你很多麻煩。 – jarlh

+0

當他們給我發送這個功能時,數值是這樣的 –

+0

而你必須處理它......太糟糕了。 – jarlh

回答

1

您可以使用插入 - 選擇此方式來自動遞增的ID:

insert into table_2(ID, ID_TRA, COND_ID) 
SELECT ROWNUM, ID_TRA, COND_ID 
FROM (
     SELECT ID_TRA, 
       trim (' ' from REGEXP_SUBSTR(COND, '([^,]*)(,|$)', 1, LEVEL, NULL, 1)) AS COND_ID 
     FROM table_1 t 
     CONNECT BY 
       ID_TRA = PRIOR ID_TRA 
     AND PRIOR SYS_GUID() IS NOT NULL 
     AND LEVEL < REGEXP_COUNT(COND, '([^,]*)(,|$)') 
     ORDER BY 1, 2 
     ) 

的順序很重要決定如何分配表中的ID;您可以通過修改ORDER BY進行編輯。 拆分字符串的方法取自SO documentation

如果您需要將新行添加到table_2,而不是從頭開始填充它,則應該更好地使用序列; rownum的解決方案僅適用於目標表爲空的情況。

+0

感謝所有朋友。 –

+0

如果我把序列放在選擇stastation不工作? 插入到TABLE_2(ID,ID_TRA,COND_ID) SELECT MY_SQ.nextval,ID_TRA,COND_ID FROM(SELECT ID_TRA, 修整(」 '從REGEXP_SUBSTR(COND,'([^,] *)(,| $ ) '1,LEVEL,NULL,1))AS COND_ID FROM TABLE_1噸 CONNECT BY ID_TRA = PRIOR ID_TRA 和現有SYS_GUID()IS NOT NULL AND LEVEL

+0

如果您想要一個序列,只需在外部查詢中使用your_sequence.nextVal而不是ROWNUM – Aleksej

0

試試這個:

insert into table_2(ID, ID_TRA, cond) 
select rownum,id_tra,trim(regexp_substr(t.cond, '[^,]+', 1, levels.column_value)) as prjcd from table_1 t, 
table(cast(multiset(select level from dual connect by level <= length (regexp_replace(t.cond, '[^,]+')) + 1) as sys.OdciNumberList)) levels;