Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Spalte Trim oder?

Dieses Thema im Forum "Oracle" wurde erstellt von Homeros, 2 November 2015.

  1. Homeros

    Homeros Benutzer

    Hallo,



    ich habe eine Spalte die wo die Werte durch ; und , getränt werden.

    Ist:
    ;844396,765522;20005,87462;20002,62148;20001,60203;65898,65899;20014,60191;20011,50007;

    Soll:
    844396
    765522
    20005
    87462
    20002
    62148
    20001
    60203
    65898
    65899
    20014
    60191
    20011
    50007
    Ich möchte jetzt gern die Werte einzehl auslesen und weiter verarbeiten.

    Trim geht leider nicht da die Werte nicht gleich lang sind.

    Es gibt doch die möglichkeit zu sagen Trenne nach den ersten , und trenne nach den zweiten; usw.

    Über ein Tipp wäre ich sehr dankbar.
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Hat Oracle was vergleichbares zu regexp_split_to_table wie PostgreSQL?

    Code:
    test=*# select regexp_split_to_table(';844396,765522;20005,87462;20002,62148;20001,60203;65898,65899;20014,60191;20011,50007;','[;,]');
     regexp_split_to_table
    -----------------------
    
     844396
     765522
     20005
     87462
     20002
     62148
     20001
     60203
     65898
     65899
     20014
     60191
     20011
     50007
    
    (16 rows)
    
    test=*#
    
     
  3. Distrilec

    Distrilec Datenbank-Guru

    Kenne nur diese Methode...
    Code:
    With dat As
    (
    Select 'Hallo,wie;gehts,?' as val From dual
    )
    Select regexp_substr(val, '[^,;]+', 1, level)
    From   dat
    Connect By level <= length(regexp_replace(val, '[^,;]+')) +1
    Edit: Laut google gibt es auch noch ne "xmltable"-Variante... Hab ich aber noch nie verwendet...
     
  4. Homeros

    Homeros Benutzer

    Leider habe ich bei Oracle nichts vergleichbares gefunden :(
    Vielen dank für deine schnelle Antwort.
     
  5. Homeros

    Homeros Benutzer

    @Distrilec vielen Dank
    Darf ich meine Aufgabe noch mal umstellen *peinlich*
    wenn ich nicht
    REGEXP_SUBSTR(VAL,'[^,;]+',1,L
    844396
    765522
    20005
    87462
    20002
    62148
    20001
    60203
    65898
    65899
    20014
    60191
    20011
    50007

    sonder die Ausgabe doch lieber als tabelle haben möchte :confused:
    1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
    844396 | 765522 | 20005| 87462 | 20002 | 62148 | 20001 | 60203 | 65898 | 65899 | 20014 | 60191 | 20011 | 50007 |
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Das ist eher schlecht. Ichdenke, Du solltest Dein Tabellendesign überdenken.
     
  7. Homeros

    Homeros Benutzer

    @akretschmer
    Du hast recht erst denken dann schreiben Sorry
    Leider bekomme ich aus der Datenbank den String so "vorgesetzt" und muss ihn jetzt weiter bearbeiten.
    Ich brauch den aus den String bestimmte Werte mit dem ich weitere abfragen erzeugen darf.
     
  8. Distrilec

    Distrilec Datenbank-Guru

    Nein, eine Datenbank spuckt nicht einfach Daten aus... Man macht eine Anfrage und diese wird beantwortet... Wenn dir die Antwort nicht passt, vllt. mal die Anfrage ändern? ;)
     
  9. Homeros

    Homeros Benutzer

    @Distrilec
    Leider habe ich in der Dantenbak eine Klasse mit ein Attribut welches den Inhalt ";844396,765522;20005,87462;20002,62148;20001,60203;65898,65899;20014,60191;20011,50007;" hat.
    Durch den select (abfrage einschrängung auf das Attribut) habe ich den Wert.
    Leider komme ich mit Trim nicht weiter. Da der Wert im Attribut von unterschiedlicher länge ist. Der einzige anhaltspunkt ist das, und ;
    Und ja wie oben beschrieben habe ich zuschnell geschrieben sorry
    Bin auch grad dabei ob ich das nicht mit
    SELECT INITCAP(REGEXP_SUBSTR
    lösen könnte :confused::D
     
  10. Distrilec

    Distrilec Datenbank-Guru

    Ich möchte nicht sagen dass es unmöglich ist... Es ist definitiv möglich (Mit viel PL/SQL, SQL und dynamic SQL gewurschtel)...
    Aber es wäre wirklich sinnvoller das ganze gescheit abzulegen.
     
  11. Homeros

    Homeros Benutzer

    Für alle die mal so ein Problem haben sollte und gern auf PL/SQL verzichten möchten.

    SELECT
    INITCAP(REGEXP_SUBSTR(';844396,765522;20005,87462;20002,62148;20001,60203;65898,65899;20014,60191;20011,50007;' , '[^, ;]+',1,1)) AS Klasse_1,
    INITCAP(REGEXP_SUBSTR(';844396,765522;20005,87462;20002,62148;20001,60203;65898,65899;20014,60191;20011,50007;' , '[^, ;]+',1,2)) AS Klasse_2,
    INITCAP(REGEXP_SUBSTR(';844396,765522;20005,87462;20002,62148;20001,60203;65898,65899;20014,60191;20011,50007;' , '[^, ;]+',1,3)) AS Klasse_3
    FROM
    dual

    Wobei 1,2,3 die Position der Spalten angibt.
     
    Distrilec gefällt das.
  12. akretschmer

    akretschmer Datenbank-Guru

    Hier offenbart sich das ganze Drama des vergurkten Designs. Dir ist die Länge des Wertes nicht bekannt (siehe Deine Antwort #9), wie willst Du also wissen, ob Du 3, 13 oder 365 Spalten bekommst? Oder 47?

    Um das dynamisch zu lösen wirst Du das SQL dynamisch erstellen und via EXECUTE (PostgreSQL-Speak) ausführen müssen. Die bessere Lösung wäre: das vergurkte Design zu bereinigen. Glaub mir.
     
  13. ukulele

    ukulele Datenbank-Guru

    Ich glaube er kennt die Anzahl der Spalten aber nicht die Länge der Werte.
     
  14. Homeros

    Homeros Benutzer

    @ukulele richtig.
    Es kann sein das ich mich nicht verständlich ausgedrückt habe.
    Leider kommt es doch mal vor, dass man eine DB Vorfindete die nicht den vorgestellten Design entpricht. Jeder Designer verfolgt doch unterschiedliche Ansätze die zum gleichen Ziel führen sollten ;)
     
  15. ukulele

    ukulele Datenbank-Guru

    ...und manche davon sind einfach nur scheisse :)
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden