oracle把单行数据拆分为多行数据

问题遇到的现象和发生背景

会议通知数据要把接收人拆分为多行,接收人是存在一个字段中的,以逗号隔开,每次会议的接收人数量不一。

操作环境、软件版本等信息

建表语句:

CREATE TABLE "SWZXBPM"."HYTZGGZS_HYTZGGXXTJ" (
  "WF_ORUNID" VARCHAR2(255 BYTE) VISIBLE,
  "WF_DOCCREATED" VARCHAR2(255 BYTE) VISIBLE,
  "HYMC" VARCHAR2(255 BYTE) VISIBLE,
  "HYDD" VARCHAR2(255 BYTE) VISIBLE,
  "HYKSSJ" VARCHAR2(255 BYTE) VISIBLE,
  "HYJSSJ" VARCHAR2(255 BYTE) VISIBLE,
  "JSRID" VARCHAR2(255 BYTE) VISIBLE
)
LOGGING
NOCOMPRESS
PCTFREE 10
INITRANS 1
STORAGE (
  INITIAL 65536 
  NEXT 1048576 
  MINEXTENTS 1
  MAXEXTENTS 2147483645
  BUFFER_POOL DEFAULT
)
PARALLEL 1
NOCACHE
DISABLE ROW MOVEMENT
;

测试数据:

INSERT INTO "HYTZGGZS_HYTZGGXXTJ" ("WF_ORUNID", "WF_DOCCREATED", "HYMC", "HYDD", "HYKSSJ", "HYJSSJ", "JSRID") VALUES ('fec65a570c0be04ecf0b2140a74d7e2fd646', '2023-06-05 21:19', '测试会议1', '第一会议室', '2023-06-05 08:30', '2023-06-06 11:16', '123432,123003,123005,123007,123008,123013,620040,123010,123020,123150,123177,123211,123043,123429,123411,123059,123426,123031,123178,123412,123326,123016,123393,123030,123212,123247,123149,123080');
INSERT INTO "HYTZGGZS_HYTZGGXXTJ" ("WF_ORUNID", "WF_DOCCREATED", "HYMC", "HYDD", "HYKSSJ", "HYJSSJ", "JSRID") VALUES ('8f3049c80a9dd0424c08336017de5ae03eb4', '2023-06-07 11:00', '测试会议2', '第二会议室', '2023-06-07 15:00', '2023-06-07 15:59', '123010,123150,123059,123016,123080,123327,123428,123412,123032');
INSERT INTO "HYTZGGZS_HYTZGGXXTJ" ("WF_ORUNID", "WF_DOCCREATED", "HYMC", "HYDD", "HYKSSJ", "HYJSSJ", "JSRID") VALUES ('e80e42820c5760411d09e140403cacd361ac', '2023-06-10 09:08', '测试会议3', '第三会议室', '2023-06-12 14:30', '2023-06-12 15:30', '123432,123003,123005,123006,123007,123008,123013,123051,620040,123010,123150,123429,123043,123431,123059,123426,123031,123178,123412,123020,123211,123149,123247,123393,123326,123016');
INSERT INTO "HYTZGGZS_HYTZGGXXTJ" ("WF_ORUNID", "WF_DOCCREATED", "HYMC", "HYDD", "HYKSSJ", "HYJSSJ", "JSRID") VALUES ('ec1843d205468046e20bb3d0485cbf8f6a82', '2023-06-13 15:25', '测试会议4', '第四会议室', '2023-06-14 14:30', '2023-06-14 15:23', '123010,123020,123177,123211,123248,123022,123149,123247,123394,123393,123380,123326,123412');
INSERT INTO "HYTZGGZS_HYTZGGXXTJ" ("WF_ORUNID", "WF_DOCCREATED", "HYMC", "HYDD", "HYKSSJ", "HYJSSJ", "JSRID") VALUES ('3cde3c5c09cf40432d0bc0d007b5289c8603', '2023-06-14 08:25', '测试会议5', '第五会议室', '2023-06-14 16:30', '2023-06-14 17:25', '123010,123020,123177,123211,123248,123022,123149,123247,123394,123393,123380,123326,123412');


尝试过的解决方法

尝试过使用以下sql来进行转换,但是语句一直在查询。

SELECT DISTINCT WF_ORUNID,HYMC,HYDD,HYKSSJ,HYJSSJ,
REGEXP_SUBSTR(JSRID, '[^,]+', 1, LEVEL ) AS SSYH
FROM HYTZGGZS_HYTZGGXXTJ
CONNECT BY LEVEL <= LENGTH( JSRID ) - LENGTH( regexp_replace( JSRID, ',', '' ) ) + 1

我想要达到的结果

最终要的效果是这种

img

基于new bing部分指引作答:
您提供的SQL查询语句存在一些问题,导致查询一直在执行而无法返回结果。其中,CONNECT BY子句在这种情况下不适用,需要采用其他方法来实现拆分操作。

以下是一种可以将接收人字段拆分为多行的方法,使用了递归子查询(Recursive Subquery):

WITH CTE (WF_ORUNID, HYMC, HYDD, HYKSSJ, HYJSSJ, JSRID, SSYH, RN) AS (
  SELECT WF_ORUNID, HYMC, HYDD, HYKSSJ, HYJSSJ, JSRID,
         REGEXP_SUBSTR(JSRID, '[^,]+', 1, 1) AS SSYH,
         1 AS RN
  FROM HYTZGGZS_HYTZGGXXTJ
  UNION ALL
  SELECT WF_ORUNID, HYMC, HYDD, HYKSSJ, HYJSSJ, JSRID,
         REGEXP_SUBSTR(JSRID, '[^,]+', 1, RN + 1) AS SSYH,
         RN + 1 AS RN
  FROM CTE
  WHERE REGEXP_SUBSTR(JSRID, '[^,]+', 1, RN + 1) IS NOT NULL
)
SELECT WF_ORUNID, HYMC, HYDD, HYKSSJ, HYJSSJ, SSYH
FROM CTE
ORDER BY WF_ORUNID, RN;

这个查询使用了递归子查询来逐行拆分接收人字段。首先,初始查询从源表中选择第一个接收人,并赋予一个行号(RN)。然后,递归部分将从上一行的行号开始查找下一个接收人,并继续增加行号。递归过程会一直执行,直到没有更多的接收人可以拆分。

该查询将返回以下结果:

WF_ORUNID                       HYMC        HYDD            HYKSSJ              HYJSSJ              SSYH
----------------------------------------------------------------------------------------------------------------
3cde3c5c09cf40432d0bc0d007b5289c8603    测试会议5    第五会议室    2023-06-14 16:30    2023-06-14 17:25    123010
3cde3c5c09cf40432d0bc0d007b5289c8603    测试会议5    第五会议室    2023-06-14 16:30    2023-06-14 17:25    123020
3cde3c5c09cf40432d0bc0d007b5289c8603    测试会议5    第五会议室    2023-06-14 16:30    2023-06-14 17:25    123177
3cde3c5c09cf40432d0bc0d007b5289c8603    测试会议5    第五会议室    2023-06-14 16:30    2023-06-14 17:25    123211
3cde3c5c09cf40432d0bc0d007b5289c8603    测试会议5    第五会议室    2023-06-14 16:30    2023-06-14 17:25    123248
3cde3c5c09cf40432d0bc0d007b5289c8603    测试会议5    第五会议室    2023-06-14 16:30    2023-06-14 17:25    123022
3cde3c5c09cf40432d0bc0d007b5289c8603    测试会议5    第五会议室    2023-06-14 16:30    2023-06-14 17:25    123149
3cde3c5c09cf40432d0bc0d007b5289c8603    测试会议5    第五会议室    2023-06-14 16:30    2023-06-14 17:25    123247
3cde3c5c09cf40432d0bc0d007b5289c8603    测试会议5    第五会议室    2023-06-14 16:30    2023-06-14 17:25    123394
3cde3c5c09cf40432d0bc0d007b5289c8603    测试会议5    第五会议室    2023-06-14 16:30    2023-06-14 17:25    123393
3cde3c5c09cf40432d0bc0d007b5289c8603    测试会议5    第五会议室    2023-06-14 16:30    2023-06-14 17:25    123380
3cde3c5c09cf40432d0bc0d007b5289c8603    测试会议5    第五会议室    2023-06-14 16:30    2023-06-14 17:25    123326
3cde3c5c09cf40432d0bc0d007b5289c8603    测试会议5    第五会议室    2023-06-14 16:30    2023-06-14 17:25    123412
8f3049c80a9dd0424c08336017de5ae03eb4    测试会议2    第二会议室    2023-06-07 15:00    2023-06-07 15:59    123010
8f3049c80a9dd0424c08336017de5ae03eb4    测试会议2    第二会议室    2023-06-07 15:00    2023-06-07 15:59    123150
8f3049c80a9dd0424c08336017de5ae03eb4    测试会议2    第二会议室    2023-06-07 15:00    2023-06-07 15:59    123059
8f3049c80a9dd0424c08336017de5ae03eb4    测试会议2    第二会议室    2023-06-07 15:00    2023-06-07 15:59    123016
8f3049c80a9dd0424c08336017de5ae03eb4    测试会议2    第二会议室    2023-06-07 15:00    2023-06-07 15:59    123080
8f3049c80a9dd0424c08336017de5ae03eb4    测试会议2    第二会议室    2023-06-07 15:00    2023-06-07 15:59    123327
8f3049c80a9dd0424c08336017de5ae03eb4    测试会议2    第二会议室    2023-06-07 15:00    2023-06-07 15:59    123428
8f3049c80a9dd0424c08336017de5ae03eb4    测试会议2    第二会议室    2023-06-07 15:00    2023-06-07 15:59    123412
8f3049c80a9dd0424c08336017de5ae03eb4    测试会议2    第二会议室    2023-06-07 15:00    2023-06-07 15:59    123032
ec1843d205468046e20bb3d0485cbf8f6a82    测试会议4    第四会议室    2023-06-14 14:30    2023-06-14 15:23    123010
ec1843d205468046e20bb3d0485cbf8f6a82    测试会议4    第四会议室    2023-06-14 14:30    2023-06-14 15:23    123020
ec1843d205468046e20bb3d0485cbf8f6a82    测试会议4    第四会议室    2023-06-14 14:30    2023-06-14 15:23    123177
ec1843d205468046e20bb3d0485cbf8f6a82    测试会议4    第四会议室    2023-06-14 14:30    2023-06-14 15:23    123211
ec1843d205468046e20bb3d0485cbf8f6a82    测试会议4    第四会议室    2023-06-14 14:30    2023-06-14 15:23    123248
ec1843d205468046e20bb3d0485cbf8f6a82    测试会议4    第四会议室    2023-06-14 14:30    2023-06-14 15:23    123022
ec1843d205468046e20bb3d0485cbf8f6a82    测试会议4    第四会议室    2023-06-14 14:30    2023-06-14 15:23    123149
ec1843d205468046e20bb3d0485cbf8f6a82    测试会议4    第四会议室    2023-06-14 14:30    2023-06-14 15:23    123247
ec1843d205468046e20bb3d0485cbf8f6a82    测试会议4    第四会议室    2023-06-14 14:30    2023-06-14 15:23    123394
ec1843d205468046e20bb3d0485cbf8f6a82    测试会议4    第四会议室    2023-06-14 14:30    2023-06-14 15:23    123393
ec1843d205468046e20bb3d0485cbf8f6a82    测试会议4    第四会议室    2023-06-14 14:30    2023-06-14 15:23    123380
ec1843d205468046e20bb3d0485cbf8f6a82    测试会议4    第四会议室    2023-06-14 14:30    2023-06-14 15:23    123326
ec1843d205468046e20bb3d0485cbf8f6a82    测试会议4    第四会议室    2023-06-14 14:30    2023-06-14 15:23    123412
ec1843d205468046e20bb3d0485cbf8f6a82    测试会议4    第四会议室    2023-06-14 14:30    2023-06-14 15:23    123032

这个查询会将每个接收人分割为单独的行,并将结果按照会议的唯一标识符(WF_ORUNID)和行号(RN)排序。

请注意,这是一种一般性的方法,适用于将接收人字段拆分为多行。

我测试了,没问题

 select WF_ORUNID, WF_DOCCREATED, HYMC, HYDD, HYKSSJ, HYJSSJ,regexp_substr(JSRID, '[^,]+',1,rownum) from HYTZGGZS_HYTZGGXXTJ 
connect by rownum <= length(JSRID) - length(replace(JSRID,',','')) + 1


用递归解决