2016-10-04 4 views
2

Ich habe die folgenden String-Werte in einer Spalte in einer SQL Server-Datenbanktabelle:Teilzeichenkette aus einer Zeichenkette in SQL-Extrahierung trennen

CS-NO2-T6082 BROWN,STORAGE  
CS-NO2-T6082 BROWN      
CS-CT2N64045,POW REC X 2,ROCKER   
CONSOLE,CS-CT2N74045,POW REC X 2   
CS 
CS,MAN REC 
CS-T6082,POW REC X 2            
CS-CT12N1176 
CS-NO2-T6082 BROWN,SQUARE 
CS-CT12N1176                 
CS-2T1176 GREY 

I-Werte versuche nur abgerufen werden, wenn sie von ‚CS‘ vorangestellt ist Es gibt jedoch mehrere Fälle, wie in den obigen Beispielen gezeigt. "CS" kann entweder einzeln oder mit durch "-" getrennter Nummer und dann durch ein Leerzeichen getrennt erscheinen. Es kann am Anfang eines Strings sein, in der Mitte oder am Ende. Ich möchte zuerst prüfen, ob es nur einen Wert in der Spalte gibt, indem ich nach einem Komma suche, wenn es nur einen Wert gibt und es das Wort 'CS' enthält, dann sieht es einfach aus. Aber wenn es mehrere Werte auf beiden Seiten der Saite gibt, dann ist das ein Problem.

Ich werde alle Vorschläge oder Lösungen in SQL Server bitte zu schätzen wissen.

sollte das Ergebnis wie folgt aussehen:

CS-NO2-T6082 BROWN  
CS-NO2-T6082 BROWN      
CS-CT2N64045   
CS-CT2N74045   
CS 
CS 
CS-T6082            
CS-CT12N1176 
CS-NO2-T6082 BROWN 
CS-CT12N1176                 
CS-2T1176 GREY 

Dank.

Antwort

1

können Sie verwenden CHARINDEX + LEFT String-Funktion

CHARINDEX - Hilft Ihnen das erste Vorkommen des comma & CS im String

SUBSTRING zu identifizieren - Entpacken Sie die Zeichenfolge aus CS bis zum ersten Auftreten des Kommas im String

SELECT org_string, 
     Result_string = substring(org_string,pos,CASE WHEN Charindex(',', org_string,pos+1) <> 0 then Charindex(',', org_string,pos+1)-pos else len(org_string) end) 
FROM (VALUES ('CS-NO2-T6082 BROWN,STORAGE'), 
       ('CS-NO2-T6082 BROWN'), 
       ('CS-CT2N64045,POW REC X 2,ROCKER'), 
       ('CONSOLE,CS-CT2N74045,POW REC X 2'), 
       ('CS'), 
       ('CS,MAN REC'), 
       ('CS-T6082,POW REC X 2'), 
       ('CS-CT12N1176'), 
       ('CS-NO2-T6082 BROWN,SQUARE'), 
       ('CS-CT12N1176'), 
       ('CS-2T1176 GREY')) cs (org_string) 
       cross apply (values (charindex('CS',org_string))) p (pos) 

Ergebnis:

╔══════════════════════════════════╦════════════════════╗ 
║   org_string   ║ Result_string ║ 
╠══════════════════════════════════╬════════════════════╣ 
║ CS-NO2-T6082 BROWN,STORAGE  ║ CS-NO2-T6082 BROWN ║ 
║ CS-NO2-T6082 BROWN    ║ CS-NO2-T6082 BROWN ║ 
║ CS-CT2N64045,POW REC X 2,ROCKER ║ CS-CT2N64045  ║ 
║ CONSOLE,CS-CT2N74045,POW REC X 2 ║ CS-CT2N74045  ║ 
║ CS        ║ CS     ║ 
║ CS,MAN REC      ║ CS     ║ 
║ CS-T6082,POW REC X 2    ║ CS-T6082   ║ 
║ CS-CT12N1176      ║ CS-CT12N1176  ║ 
║ CS-NO2-T6082 BROWN,SQUARE  ║ CS-NO2-T6082 BROWN ║ 
║ CS-CT12N1176      ║ CS-CT12N1176  ║ 
║ CS-2T1176 GREY     ║ CS-2T1176 GREY  ║ 
╚══════════════════════════════════╩════════════════════╝ 
+0

Das 4. Ergebnis (CONSOLE) ist falsch. Es fehlt der CS-Wert in der Mitte. –

+0

@HolgerBrandt - oops wird meine Antwort bearbeiten –

+0

@HolgerBrandt - meine Antwort aktualisiert jetzt prüfen –

1

Sie können es in zwei Durchgängen tun. Der erste sucht nach dem "CS" oder "CS". Die zweite sucht nach dem Komma und gibt nur den Text davor zurück (oder die ganze Zeichenfolge, wenn kein Komma vorhanden ist).

SELECT CASE WHEN CHARINDEX(',',Result1)>0 THEN LEFT(Result1,CHARINDEX(',',Result1)-1) 
      ELSE Result1 
     END AS FinalResult 
FROM 
    (SELECT CASE WHEN CHARINDEX('CS-',[Orig_String])>0 THEN SUBSTRING([Orig_String],CHARINDEX('CS-',[Orig_String]), LEN([Orig_String])) 
       ELSE [Orig_String]   
      END AS Result1 
    FROM [Table1]) AS T 
1

Interessante geschäftliche Anforderung, Test unter Skript dies wird fast Ihr Problem lösen.

SELECT CASE WHEN CHARINDEX(',',ColName) = 0 THEN ColName 
     WHEN CHARINDEX('CS',ColName) < CHARINDEX(',',ColName) THEN LEFT(ColName,CHARINDEX(',',ColName)-1) 
     WHEN CHARINDEX('CS',ColName) > CHARINDEX(',',ColName) THEN PARSENAME(REPLACE(ColName,',','.'),2) 
     END 
From TableName 
Verwandte Themen