Oracle一列转多行

  • 原创
  • |
  • 浏览:3665
  • |
  • 更新:

有时候表中存储的数据是通过某些特殊符号分隔保存批量数据(如图),查询数据时需要把其还原为原来状态便于查看和关联使用(如图)。

Oracle一列转多行

工具/原料

  • oracle数据库
  • 可以管理数据库的工具

方法/步骤

  1. 1

    新建测试表,录入测试数据。

    CREATE TABLE TEST_ONE(

        ID  VARCHAR2(5),

        NAME VARCHAR2(100)

    );

    INSERT INTO TEST_ONE (ID,NAME) VALUES('1','A:语文;B:数学;C:物理;D:化学;E:生物;');

    INSERT INTO TEST_ONE (ID,NAME) VALUES('2','x:历史;y:地理;z:政治;');

    Oracle一列转多行
  2. 1
    相关内容未经许可获取自百度经验
  3. 2

    进行数据分行处理。

    SELECT ID,KEY,RN,

        SUBSTR(STR, INSTR(STR, ';', 1, RN)+1,

            INSTR(STR, ':', 1, RN) - INSTR(STR, ';', 1, RN) - 1) "First_Str",

        SUBSTR(STR, INSTR(STR, ':', 1, RN)+1,

            INSTR(STR, ';', 1, RN+1) - INSTR(STR, ':', 1, RN) - 1) "Second_Str"

    FROM (SELECT ID,NAME KEY,';'||NAME STR FROM TEST_ONE) A, 

    (SELECT ROWNUM RN FROM DUAL CONNECT BY ROWNUM < 10) B

    WHERE INSTR(STR, ';', 1, RN+1) > 0 

    ORDER BY A.ID,B.RN;

    Oracle一列转多行
  4. 3

    语句解释1:

    原始数据处理,最前面添加对应数据分隔符(演示是“;”);便于下一步分隔数据。

    注:"||" 为字符串连接符。

    SELECT ID,NAME KEY,';'||NAME STR FROM TEST_ONE

    Oracle一列转多行
  5. 4

    语句解释2:

    注:"CONNECT BY"是层次查询子句,一般用于树或者层次结果集的查询。

    根据实际查询结果行数,适当修改"ROWNUM"的值。

    SELECT ROWNUM RN FROM DUAL CONNECT BY ROWNUM < 10

    Oracle一列转多行
  6. 5

    语句解释3:

    对字符串进行分割,首先查询出特殊符号位置,然后算出前后串之间字符长度进行截取。

    SUBSTR(STR, INSTR(STR, ';', 1, RN)+1,    INSTR(STR, ':', 1, RN) - INSTR(STR, ';', 1, RN) - 1) "First_Str"

  7. 6

    语句解释4:

    通过判断特殊符号最后位置,进行显示截取(防止层次查询中过多部分显示空值)。

    WHERE INSTR(STR, ';', 1, RN+1) > 0

    END

注意事项

  • 演示数据库为Oracle数据库。
经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。
作者声明:本篇经验系本人依照真实经历原创,未经许可,谢绝转载。
展开阅读全部