如何将SQL(Oracle)中带有3个分隔符的文本拆分为多行和多列?
我需要将像“Aa:One | Bb:Two,Three,Four | Cc:Five,Six”这样的文本拆分为行和列,以使结果看起来像- Col1 Col2 AA-1 BB2 Bb三 Bb四 Cc五 抄送六 我试过使用如何将SQL(Oracle)中带有3个分隔符的文本拆分为多行和多列?,sql,split,delimiter,Sql,Split,Delimiter,我需要将像“Aa:One | Bb:Two,Three,Four | Cc:Five,Six”这样的文本拆分为行和列,以使结果看起来像- Col1 Col2 AA-1 BB2 Bb三 Bb四 Cc五 抄送六 我试过使用 SELECT REGEXP_SUBSTR (str, '[^:]+', 1, 1) AS COL1 ,REGEXP_SUBSTR (str, '[^:]+', 1, 2) AS COL2 FROM (SELECT REGEXP_SUBSTR('Aa:One
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
)
但我只能创造
Col1 Col2
Aa-1
Bb二,三,四
抄送五,六
我不知道如何在Col2中使用逗号(,)将它进一步拆分为与Col1值的第一次出现相对应的行
在这方面的任何帮助都将不胜感激
提前感谢!:-) 我只是为
SQL Server
做了这件事。使用ORACLE
中的函数
,您可以从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
我使用临时表逻辑“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',因为查询将获取重复的行
谢谢大家的帮助!:) 你的逻辑帮助我得到了想要的结果。非常感谢!:)