2016-12-09 6 views
-1

I haben die Spalte unter der die Daten enthält alsSQL Splitting eine Spalte in 3 Spalten mit mehreren seperators

|DeliveryComment   | 
|-------------------------|  
|[1 * B018]    | 
|GARAGE     | 
|BACK GARDEN. [124 * B002]| 
|[1 * B018]    | 
|       | 
|[124 * B002]    | 
|[1 * B018]    | 
|       |  
|[124 * B002]    | 

gezeigt Ich möchte diese Daten in drei Spalten aufgeteilt, wie unten dargestellt.

|ColA  |ColB|ColC| 
|-----------|----|----|  
|   |1 |B018| 
|GARAGE  | | | 
|BACK GARDEN|124 |B002| 
|   |1 |B018|  
|   | | |  
|   |124 |B002| 
|   |1 |B018| 
|   | | |  
|   |124 |B002| 

Die Daten, die in Spalte A enden sollen, können bis zu 11 Zeichen lang sein. Die Daten, die in Spalte B enden sollten, können einen variablen numerischen Wert von bis zu 3 Zeichen haben. Die Daten, die in Spalte C enden sollten, können bis zu 4 Zeichen lang sein.

Es wird immer [] um die Nummern geben und es wird immer eine * dazwischen sein.

+0

Scheint wie eine einfache Aufgabe. Was hast du bisher versucht? –

Antwort

1

Erstellen und füllen Beispieltabelle (Bitte speichern uns diesen Schritt in Ihrer zukünftigen Fragen)

DECLARE @t AS TABLE 
(
    col varchar(50) 
) 

INSERT INTO @T VALUES 
('[1 * B018]'), 
('GARAGE'), 
('BACK GARDEN. [124 * B002]'), 
('[1 * B018]'), 
(''), 
('[124 * B002]'), 
('[1 * B018]'),   
(''), 
('[124 * B002]') 

Die Abfrage:

SELECT CASE WHEN charindex('[', col) > 0 THEN 
      LEFT(col, charindex('[', col)-1) 
     ELSE 
      col 
     END AS ColA, 

     CASE WHEN charindex('[', col) = 0 THEN 
      '' 
     ELSE 
      SUBSTRING(col, charindex('[', col) +1 ,charindex('*', col) - charindex('[', col) - 1) 
     END AS ColB, 

     CASE WHEN charindex('[', col) = 0 THEN 
      '' 
     ELSE 
      SUBSTRING(col, charindex('*', col) +1 ,charindex(']', col) - charindex('*', col) - 1) 
     END AS ColC 
FROM @T 

Ergebnisse:

ColA   ColB ColC 
       1  B018 
GARAGE  
BACK GARDEN. 124  B002 
       1  B018 

       124  B002 
       1  B018 

       124  B002 
+0

Das ist großartig. Sollte erwähnt haben, dass dies eine Beispielmenge von Daten war, gibt es eine Möglichkeit, Daten aus der gesamten Spalte in eine temporäre Tabelle zu extrahieren, wie Sie oben angegeben haben? Wenn nicht, kann ich die Felder der Abfrage der temporären Tabelle hinzufügen. –

+0

Sie könnten 'select in # tmp' verwenden, um eine temporäre Tabelle zu füllen. –

0

Diese Lösung verwendet CROSS APPLY, um die Verwaltung des CHARINDEX zu erleichtern.

SELECT 
    LEFT(SUBSTRING(col,1,CASE WHEN a= 0 THEN LEN(col) ELSE a-1 END),11) AS [ColA] 
    ,REPLACE(SUBSTRING(col,a+1,b-a),'*','') AS [ColB] 
    ,REPLACE(SUBSTRING(col,b+1,c-b),']','') AS [ColC] 
FROM 
    @t 
     CROSS APPLY(SELECT CHARINDEX('[',Col,0)A 
          ,CHARINDEX('*',Col,0)B 
          ,CHARINDEX(']',Col,0)C 
          ) Z 

Hinweis: Die Beispiele haben Sie bisher -einschließlich diese eine - zur Zeit haben vordere und hintere Räume, die mit RTRIM & LTRIM Trimmen müssen. Aber jetzt würden sie den Code verdunkeln.

Verwandte Themen