CREATE TABLE T_INFO
(
T_PERSON_ID NUMBER,
T_PERSON_NAME VARCHAR(20),
T_TYPE_ID VARCHAR(200)
);
INSERT INTO T_INFO
SELECT 1, '张三', '1,2' FROM DUAL UNION ALL
SELECT 2, '李四', '1' FROM DUAL
/*
结果
3 2 李四 1
1 1 张三 2
1 1 张三 1
把1 1 张三 1,2
这条记录分成
1 1 张三 2
1 1 张三 1
*/
------解决方案--------------------
select t_person_id,
t_person_name,
REGEXP_SUBSTR(t_type_id, '[^,]+', 1, LEVEL) STR
from T_INFO
CONNECT BY LEVEL <= REGEXP_COUNT(t_type_id, ',') + 1
and t_person_id = prior t_person_id
and prior dbms_random.value is not null;
T_PERSON_ID T_PERSON_NAME STR
----------- --------------------
1 张三 1
1 张三 2
2 李四 1
------解决方案--------------------
我用的PL/SQL写的
DECLARE
I NUMBER;
C_NUM NUMBER;
C_COUNT NUMBER;
BEGIN
FOR CR_1 IN (SELECT '1' A, 'zhang san' B, '1,2,3,4' C
FROM DUAL
UNION ALL
SELECT '2' A, 'li si' B, '1' C FROM DUAL) LOOP
SELECT LENGTH(REPLACE(CR_1.C, ',', ',,')) - LENGTH(CR_1.C) + 1
INTO C_COUNT
FROM DUAL;
FOR I IN 1 .. C_COUNT LOOP
C_NUM := INSTR(CR_1.C, ',');
INSERT INTO T_INFO
VALUES
(CR_1.A, CR_1.B, decode(SUBSTR(CR_1.C, 1, C_NUM - 1),NULL,cr_1.c,SUBSTR(CR_1.C, 1, C_NUM - 1)));
CR_1.C := SUBSTR(CR_1.C, C_NUM + 1);
END LOOP;
END LOOP;
END;
运行结果
SQL> select * from T_INFO;
T_PERSON_ID T_PERSON_NAME T_TYPE_ID
----------- -------------------- --------------------------------------------------------------------------------
1 zhang san 1
1 zhang san 2
1 zhang san 3
1 zhang san 4
2 li si 1
SQL>