none
Text splitten RRS feed

  • Frage

  • Hallo,

    ich habe eine Frage, wie kann man ein Text aus einem Select splitten?

    Bei einem Select bekomme ich eine Gruppierung, zum Beispiel "Gruppe A\Haus 2\Team 5". Wie kann ich nun den Text mit "\" splitten so das ich dann in Spalte 1 den ersten Wert, in Spalte 2 den zweiten Wert und den dritten Wert dann in Spalte 3 ausgeben kann?

    Viele Grüsse,
    Maximilian

    Montag, 5. November 2012 13:53

Antworten

  • Hallo Maximilian,

    die fixe Ausplittung könnte dann wie unten aussehen. Zum besseren Verständnis über eine CTE aufgelöst.

    Declare @Split varchar(100) = 'Gruppe A\Haus 2\Team 5';
    
    with cte
    as
    (
    Select @Split as Split,
    charindex('\', @Split) as Pos1,
    charindex('\', @Split, charindex('\', @Split)+1) as Pos2,
    len(@Split) as Laenge
    )
    Select Split, Pos1, Pos2, Laenge,
    SUBSTRING(Split,                1, Pos1                -        1                ) as Spalte_1,
    SUBSTRING(Split, Pos1 + 1, Pos2                -        (Pos1 + 1)) as Spalte_2,
    SUBSTRING(Split, Pos2 + 1, Laenge        -        Pos2        ) as Spalte_3
    from cte;

    Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP
    www.insidesql.org/blogs/cmu

    Dienstag, 6. November 2012 08:18

Alle Antworten

  • Hallo Maximilian,

    falls das ein Dauerzustand sein sollte, würde ich die Datenstruktur anpassen, so dass diese nicht ein solch suboptimales Konstrukt beherbergt. Es macht keinen Sinn, Werte, die man einzeln benötigt, in eine Spalte zu quetschen. In deinem Fall wären das entweder drei neue Spalten für Gruppe, Haus und Team, sinnvollerweise als ID Werte, die eine Fremdschlüsselbeziehung zu den jeweiligen Tabellen aufweisen. Das gilt aber nur, wenn die drei Werte Gruppe, Haus und Team immer komplett voneinander losgelöst einem Objekt zugewiesen werden können. Anderenfalls müsste man sich das nochmal im Detail anschauen.

    Eine Split Funktion gibt es in T-SQL nicht. Dennoch gibt es Wege, das nachzubauen. Siehe dazu:

      http://stackoverflow.com/questions/697519/split-function-equivalent-in-tsql

    Allerdings arbeiten die meisten Methoden nach dem Prinzip: Pro Arrayelement eine Zeile. Und nicht, wie bei dir: jeweils eine Spalte.

    Dafür wirst Du AFAIK nicht um einen verschachtelten Aufruf von SUBSTRING mit CHARINDEX drumrumkommen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Montag, 5. November 2012 14:45
    Moderator
  • Hallo Maximilian,

    die fixe Ausplittung könnte dann wie unten aussehen. Zum besseren Verständnis über eine CTE aufgelöst.

    Declare @Split varchar(100) = 'Gruppe A\Haus 2\Team 5';
    
    with cte
    as
    (
    Select @Split as Split,
    charindex('\', @Split) as Pos1,
    charindex('\', @Split, charindex('\', @Split)+1) as Pos2,
    len(@Split) as Laenge
    )
    Select Split, Pos1, Pos2, Laenge,
    SUBSTRING(Split,                1, Pos1                -        1                ) as Spalte_1,
    SUBSTRING(Split, Pos1 + 1, Pos2                -        (Pos1 + 1)) as Spalte_2,
    SUBSTRING(Split, Pos2 + 1, Laenge        -        Pos2        ) as Spalte_3
    from cte;

    Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP
    www.insidesql.org/blogs/cmu

    Dienstag, 6. November 2012 08:18
  • Hallo Christoph,

    vielen Dank für Dein Tipp, werde den gleich mal versuchen.

    Nochmals besten Dank,
    Maximilian

    Dienstag, 6. November 2012 16:14
  • Hallo Stefan,

    leider ist das ein Zustand den wir nicht ändern können. Das Programm arbeitet leider so, ich kann nur versuchen einigermassen die Daten zu verwenden damit wir Auswertungen fahren können die wir brauchen.

    Viele Grüsse,
    Maximilian

    Dienstag, 6. November 2012 16:16
  • Hallo Maximilian,

    Hat Dir die Antwort von Christoph geholfen? Wenn ja - bitte markiere diese "als Antwort".

    Danke und Gruß,
    Ionut

    Montag, 12. November 2012 15:27
    Moderator
  • Hallo Maximilian,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Wenn nein, neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.

    Danke und Gruß,
    Ionut

    Mittwoch, 14. November 2012 12:10
    Moderator