从逗号分隔列表中插入拆分值

时间:2016-08-09 10:50:00

标签: sql oracle select

我想将值从一个表插入到另一个表中,但第一个表的值存储在一个字符串中,以逗号分隔。 我必须自动插入所有值而不指定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

注意

ID必须在插入

时自动递增

2 个答案:

答案 0 :(得分:1)

你可以这样使用insert-select:

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的解决方案仅在目标表为空时才有效。

答案 1 :(得分: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;