当前位置: 代码迷 >> Oracle管理 >> 一字段含有逗号分隔的串,把这条记录按逗号分隔分成多条记录,具体如下
  详细解决方案

一字段含有逗号分隔的串,把这条记录按逗号分隔分成多条记录,具体如下

热度:61   发布时间:2016-04-24 04:31:03.0
一字段含有逗号分隔的串,把这条记录按逗号分隔分成多条记录,具体如下,在线等
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
*/

------解决方案--------------------
引用:
结果
    2    李四    1
    1    张三    2
    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> 
  相关解决方案