oracle 拆分逗号转行_一个列用逗号隔开,列转行,看看是否有更好的办法。

表mytest1,  表结构,初始数据如下:

SQL> desc mytest1;

Name        Type           Nullable Default Comments

----------- -------------- -------- ------- --------

DEPART_ID   VARCHAR2(10)   Y

OBJECT_NAME VARCHAR2(4000) Y复制代码

SQL> select * from mytest1;

DEPART_ID  OBJECT_NAME

---------- --------------------------------------------------------------------------------

helpdesk   FILE$,I_FILE1,I_IND1,I_PROXY_ROLE_DATA$_1

human      CON$,ICOL$,I_OBJ3

manager    C_COBJ#,I_CDEF2,I_OBJ#

spy        I_CDEF4,I_FILE#_BLOCK#,I_OBJ5,I_TS#,UET$

tech       I_CON1,I_USER1,PROXY_ROLE_DATA$,UNDO$

由于列object_name全部为逗号分隔,希望转化为:

DEPART_ID  SUBSTR(OBJECT_NAME,DECODE(LEVE                                                        LEVEL

---------- -------------------------------------------------------------------------------- ----------

helpdesk   FILE$                                                                                     1

helpdesk   I_FILE1                                                                                   2

helpdesk   I_IND1                                                                                    3

helpdesk   I_PROXY_ROLE_DATA$_1                                                                      4

human      CON$                                                                                      1

human      ICOL$                                                                                     2

human      I_OBJ3                                                                                    3

manager    C_COBJ#                                                                                   1

manager    I_CDEF2                                                                                   2

manager    I_OBJ#                                                                                    3

spy        I_CDEF4                                                                                   1

spy        I_FILE#_BLOCK#                                                                            2

spy        I_OBJ5                                                                                    3

spy        I_TS#                                                                                     4

spy        UET$                                                                                      5

tech       I_CON1                                                                                    1

tech       I_USER1                                                                                   2

tech       PROXY_ROLE_DATA$                                                                          3

tech       UNDO$                                                                                     4

目前我采用的SQL如下:

SELECT distinct depart_id,

substr(object_name,

DECODE(LEVEL,

1,

1,

regexp_count(object_name, ',') + 1,

INSTR(object_name,

',',

1,

regexp_count(object_name, ',')) + 1,

INSTR(object_name, ',', 1, LEVEL - 1) + 1),

DECODE(LEVEL,

regexp_count(object_name, ',') + 1,

INSTR(REVERSE(object_name), ',', 1) - 1,

INSTR(object_name, ',', 1, LEVEL) -

DECODE(LEVEL,

1,

1,

INSTR(object_name, ',', 1, LEVEL - 1) + 1))),

LEVEL

from mytest1

CONNECT BY LEVEL <= regexp_count(object_name, ',') + 1

order by depart_id, level;

由于CONNECT BY 这个地方没有什么限制,所以垃圾数据太多,通过distinct过滤之后数据是没问题,应该还有更简单的SQL。 谁能try 一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值