如何将 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
做了这个。您可以使用 ORACLE
中 Functions
的替代项从 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',因为查询会获取重复的行。
感谢大家的帮助! :)
我需要将 "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
做了这个。您可以使用 ORACLE
中 Functions
的替代项从 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',因为查询会获取重复的行。
感谢大家的帮助! :)