2017-11-14 7 views
-1

Ich brauche einen Text wie aufzuspalten "Aa: One | Bb: Zwei, Drei, Vier | Cc: Fünf, Sechs" in Zeilen und Spalten für das Ergebnis aussehen -Wie spalte ich einen Text mit 3 Trennzeichen in SQL (Oracle) in mehrere Zeilen und Spalten?

Col1 Col2

AA One

Bb Zwei

Bb Drei

Bb Vier

Cc Fünf

Cc Sechs

Ich habe versucht mit

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 
    ) 

Aber ich konnte nur

Col1 Col2

Aa One

erstellen

Bb Zwei, Drei, Vier

Cc Fünf, Sechs

Ich bin nicht sicher, wie es weiter mit Komma trennen (,) in Col2 in Reihen gegen das erste Auftreten des Col1 Wert

Jede Hilfe in dieser Hinsicht wäre sehr willkommen.

Vielen Dank im Voraus! :-)

Antwort

0

ich die temporäre Tabelle Logik 'MIT t AS()' verwendet, um die Ergebnismenge mit der folgenden Abfrage zu erstellen -

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 

Anscheinend , Ich musste "Distinct" für Col1 verwenden, da die Abfrage doppelte Zeilen abrufen würde.

Vielen Dank für die Hilfe! :)

0

Ich habe das nur für SQL Server getan. Sie können das gleiche Ergebnis von ORACLE mit den Alternativen für die Functions in ORACLE erhalten.

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 

Und mein Ergebnis ist:

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

Ihre Logik half mir, das gewünschte Ergebnis zu erhalten. Danke vielmals ! :) –

Verwandte Themen