2017-01-03 7 views
0

Ich habe eine Anforderung, den Inhalt einer Spalte in Zeilen auf Oracle zu analysieren.Spalte in Zeilen in Oracle

Eingang String:

"Honda","Civic"\n"Toyota","Camry"\n"Ford","Fusion" 

Anforderung 1: Konvertieren Sie die obige Zeichenfolge in einzelne Zeilen auf der \ n Trennzeichen basiert und in einer einzigen Spalte laden, wie unten gezeigt,

Column 1 
------  
"Honda","Civic" 
"Toyota","Camry" 
"Ford","Fusion" 

Kann jemand bitte Hilf mir bei der Syntax auf Oracle?

+1

Willkommen bei SO. Hier findest du etwas zu [fragen] und wie man ein [mcve] erstellt, das nützlich sein kann, um deine Frage zu verbessern. Zeigen Sie vor allem, was Sie bisher versucht haben; Fragen wie "wie man das macht", ohne sich Mühe zu geben, sind normalerweise nicht erwünscht. – Aleksej

+1

[Diese Frage] (http://stackoverflow.com/questions/3819375/convert-comma-separated-string-to-array-in -pl-sql) hat viele gute Antworten, die meiner Meinung nach hier anwendbar sind. Ersetzen Sie einfach \ n für, – Matt

+0

Ist die Eingabe genau so, wobei die Zeichen '\ n' als Trennzeichen verwendet werden? Dann - müssen Sie sie nur aufbrechen, wie Sie gezeigt haben, müssen Sie nicht Hersteller und Modell in getrennten Spalten trennen? (Vielleicht sollten Sie!) – mathguy

Antwort

0

Nur zum Spaß - hier ist eine Möglichkeit, den Hersteller und das Modell in separaten Spalten, ohne die \n, die Kommas und die Anführungszeichen zu bekommen. Sie können die Lösung so anpassen, dass Sie den Hersteller und das Modell in doppelten Anführungszeichen und durch Komma getrennt in einer einzigen Spalte erhalten, wenn dies tatsächlich erforderlich ist. (Wenn das als Zwischenschritt gedacht war, brauchen Sie es nicht.) Beachten Sie, dass ich lieber mit dem doppelten Anführungszeichen als "Marker" arbeite, um nicht mit \n umgehen zu müssen - und Sie können es auch tun , wenn Sie die folgende Lösung ändern müssen.

Ich nahm an, dass die Zeichenfolgen genau in dem Format sind, das Sie anzeigen. Ich habe eine kleine Testtabelle mit zwei Zeilen erstellt, um zu zeigen, wie die Lösung in diesem Fall funktioniert. Wenn es eine einzelne Zeile gibt, werden Sie möglicherweise nicht auf einige der Komplikationen stoßen, wenn mehrere Zeilen vorhanden sind, und ich wollte eine allgemeinere Lösung.

Ich schrieb die Lösung nur mit Standard-String-Funktionen (keine regulären Ausdrücke), was zu einer schnelleren Ausführung führen sollte.

with 
    test_data (id, str) as (
     select 1, '"Honda","Civic"\n"Toyota","Camry"\n"Ford","Fusion"' from dual union all 
     select 2, '"Chevrolet","Volt"\n"Tesla","Model S"'    from dual 
    ) 
-- end of test data; solution (SQL query) begins below this line 
select id, 
     substr(str, 1 + instr(str, '"', 1, 1 + 4 * (level - 1)), 
        instr(str, '"', 1, 2 + 4 * (level - 1)) - 
         instr(str, '"', 1, 1 + 4 * (level - 1)) - 1) as manufacturer, 
     substr(str, 1 + instr(str, '"', 1, 3 + 4 * (level - 1)), 
        instr(str, '"', 1, 4 + 4 * (level - 1)) - 
         instr(str, '"', 1, 3 + 4 * (level - 1)) - 1) as model_name 
from test_data 
connect by level <= 1 + length(str) - length(replace(str, '\', '')) 
     and prior id = id 
     and prior sys_guid() is not null 
; 

ID MANUFACTURER MODEL_NAME 
--- ------------ ------------ 
    1 Honda  Civic 
    1 Toyota  Camry 
    1 Ford   Fusion 
    2 Chevrolet Volt 
    2 Tesla  Model S 

5 rows selected.