如何将 SQL (Oracle) 中带有 3 个分隔符的文本拆分为多行和多列?

How do I split a Text with 3 delimiters in SQL (Oracle) into multiple rows and columns?

我需要将 "Aa:One|Bb:Two,Three,Four|Cc:Five,Six" 之类的文本拆分为行和列,以使结果看起来像 -

第 1 列第 2 列

AA 一

Bb 二

Bb 三

Bb 四

抄送五

抄送六

我试过使用

SELECT REGEXP_SUBSTR (str, '[^:]+', 1, 1)    AS COL1
      ,REGEXP_SUBSTR (str, '[^:]+', 1, 2)    AS COL2
FROM (SELECT REGEXP_SUBSTR('Aa:One|Bb:Two,Three,Four|Cc:Five,Six', '[^|]+', 1, LEVEL) AS str
      FROM DUAL
      CONNECT BY INSTR('Aa:One|Bb:Two,Three,Four|Cc:Five,Six', '|', 1, LEVEL - 1) > 0
      )

但我只能创建

第 1 列第 2 列

Aa 一个

Bb 二、三、四

抄送五、六

我不确定如何使用 Col2 中的 comma(,) 将其进一步拆分为针对 Col1 值首次出现的行

在这方面的任何帮助将不胜感激。

提前致谢! :-)

我刚刚为 SQL Server 做了这个。您可以使用 ORACLEFunctions 的替代项从 ORACLE 获得相同的结果。

DECLARE @Id VARCHAR(100)='Aa:One|Bb:Two,Three,Four|Cc:Five,Six'

SELECT LEFT(items, CHARINDEX(':',items)-1)Col1
    ,RIGHT(items, CHARINDEX(':',REVERSE(items))-1)Col2 
INTO #Temp
FROM dbo.Split(@Id,'|')

SELECT p.Col1, colortable.items as Col2
FROM #Temp p 
    cross apply split(p.Col2, ',') as colortable

DROP TABLE #Temp

我的结果是:

Col1    Col2
Aa      One
Bb      Two
Bb      Three
Bb      Four
Cc      Five
Cc      Six

我使用临时 table 逻辑 'WITH t AS ()' 通过以下查询创建结果集 -

WITH t AS (
SELECT TRIM(REGEXP_SUBSTR (str, '[^:]+', 1, 1))    AS tempCol1
  ,TRIM(REGEXP_SUBSTR (str, '[^:]+', 1, 2))    AS tempCol2
FROM (
  SELECT TRIM(REGEXP_SUBSTR('Aa:One|Bb:Two,Three,Four|Cc:Five,Six|Dd:Seven, Eight, Nine, Ten', '[^|]+', 1, LEVEL)) str
  FROM DUAL
  CONNECT BY INSTR('Aa:One|Bb:Two,Three,Four|Cc:Five,Six|Dd:Seven, Eight, Nine, Ten', '|', 1, LEVEL - 1) > 0)
)

SELECT DISTINCT(Col1)
   , Col2
FROM (
   SELECT t.tempCol1 AS Col1
     ,TRIM(REGEXP_SUBSTR(t.tempCol2, '[^,]+', 1, LEVEL)) Col2
   FROM t
   CONNECT BY INSTR(t.tempCol2, ',', 1, LEVEL - 1) > 0)
ORDER BY Col1, Col2 

显然,我不得不对 Col1 使用 'Distinct',因为查询会获取重复的行。

感谢大家的帮助! :)