oracle - 将oracle表中的多个逗号分隔值拆分为多行

Jag*_*h G 5 regex sql oracle split

我有oracle拆分查询的问题.

在使用oracle查询中的connect by和regular expression将逗号分隔数据拆分为多行时,我获得了更多的重复行.例如,实际上我的表有150行,在那两行中有逗号分隔的字符串,所以整体上我只得到155行,但我得到2000行.如果我使用distinct其工作正常但我不想在查询结果中重复行.

我尝试了以下查询,但它在查询结果中生成重复的行:

WITH CTE AS (SELECT 'a,b,c,d,e' temp,1 slno  FROM DUAL
              UNION 
              SELECT 'f,g',2 from dual
              UNION 
               SELECT 'h',3 FROM DUAL)

SELECT TRIM(REGEXP_SUBSTR( TEMP, '[^,]+', 1, LEVEL)) ,SLNO FROM CTE 
CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(temp, '[^,]+')) + 1
Run Code Online (Sandbox Code Playgroud)

编辑

上面的select查询只能拆分单个逗号分隔的字符串,但是,当在具有多行的表上执行时,它会生成重复的.如何限制重复的行?

Jag*_*h G 8

最后我想出了这个答案

WITH CTE AS (SELECT 'a,b,c,d,e' temp, 1 slno FROM DUAL
              UNION
              SELECT 'f,g' temp, 2 slno FROM DUAL
              UNION
              SELECT 'h' temp, 3 slno FROM DUAL)
SELECT TRIM(REGEXP_SUBSTR(temp, '[^,]+', 1, level)), slno
FROM CTE
CONNECT BY level <= REGEXP_COUNT(temp, '[^,]+')
    AND PRIOR slno = slno
    AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL
Run Code Online (Sandbox Code Playgroud)


Dba*_*Dba 5

试试这样,

WITH CTE AS (SELECT 'a,b,c,d,e' temp,1 slno  FROM DUAL
              UNION 
              SELECT 'f,g',2 from dual
              UNION 
              SELECT 'h',3 FROM DUAL)
     SELECT regexp_substr (temp, '[^,]+', 1, rn)temp, slno
     FROM   cte
     CROSS JOIN 
     (
          SELECT ROWNUM rn
          FROM  (SELECT MAX (LENGTH (regexp_replace (temp, '[^,]+'))) + 1 max_l
                 from cte
                 )
          connect by level <= max_l
         )
     WHERE regexp_substr (temp, '[^,]+', 1, rn) IS NOT NULL
     order by temp;
Run Code Online (Sandbox Code Playgroud)