首页 > 解决方案 > oracle中的多列行拆分

问题描述

我将单个字符串行拆分为行

例如,

A,B,C,D,E

进入

A
B
C
D
E

但我想要的是多列的单行

| A,B,C | H,I,J,K,L | Q,R,X,Y,Z |

进入

A | H | Q
B | I | R
C | J | X
  | K | Y
  | L |

我怎样才能在 oracle 中做到这一点?

标签: oraclesplit

解决方案


您可以按如下方式使用层次结构查询:

SQL> WITH DATAA ( D ) AS (
  2      SELECT '| A,B,C | H,I,J,K,L | Q,R,X,Y,Z |'
  3      FROM DUAL
  4  )
  5  -- your query starts from here
  6  SELECT TRIM(REGEXP_SUBSTR(REGEXP_SUBSTR(D.D, '[^|]+', 1, 1), '[^,]+', 1, LEVEL)) AS COL1,
  7         TRIM(REGEXP_SUBSTR(REGEXP_SUBSTR(D.D, '[^|]+', 1, 2), '[^,]+', 1, LEVEL)) AS COL2,
  8         TRIM(REGEXP_SUBSTR(REGEXP_SUBSTR(D.D, '[^|]+', 1, 3), '[^,]+', 1, LEVEL)) AS COL3
  9    FROM DATAA D
 10  CONNECT BY LEVEL <= (
 11          SELECT MAX(REGEXP_COUNT((REGEXP_SUBSTR(D.D, '[^|]+', 1, COLUMN_VALUE)), ',')) + 1
 12            FROM DATAA D
 13              CROSS JOIN TABLE ( CAST(MULTISET(
 14                  SELECT LEVEL LVL
 15                    FROM DUAL
 16                  CONNECT BY LEVEL <= REGEXP_COUNT(D.D, '[^|]+')
 17              ) AS SYS.ODCIVARCHAR2LIST) ) LVLS
 18      );

COL1    COL2        COL3
------- ----------- -----------
A       H           Q
B       I           R
C       J           X
        K           Y
        L           Z

SQL>

推荐阅读