2017-02-25 23 views
1

Wie können Sie dies in SQL in irgendeiner Weise tun?Teilen von Werten aus einer Spalte in mehrere Spalten in SQL mit verschiedenen Trennzeichen

Bitte siehe Bild oder unter:

|| Id || Column1      || 
|| 1000 || SA(13), DS(1)     || 
|| 2000 || QW(1)       || 
|| 3000 || TE(23), RE(1), BB(40), VV(5) || 

Ergebnis sein sollte:

|| Id || Column2 || Colum3 || 
|| 1000 || SA  || 13 || 
|| 1000 || DS  ||  1 || 
|| 2000 || QW  ||  1 || 
|| 3000 || TE  || 23 || 
|| 3000 || RE  ||  1 || 
|| 3000 || BB  || 40 || 
|| 3000 || VV  ||  5 || 

screenshot of the sample table

+3

Dies zeigt ein sehr schlechtes Datenbank-Design :( – Khan

Antwort

1

Eine Möglichkeit, dies in SQL Server zu tun, ist eine rekursive CTE:

with cte as (
     select id, 
      left(column1, charindex(',', column1) - 1) as col23, 
      substring(column1, charindex(',', column1) + 1) + ',' as rest 
     from t 
     union all 
     select id, 
      left(rest, charindex(',', rest) - 1) as col23 
      substring(rest, charindex(',', rest) + 1) as rest 
     from t 
     where rest like '%,%' 
    ) 
select id, left(col23, 2) as column2, 
     replace(replace(substring(col23, 3, len(col23)), '(', ''), ')', '') as column3 
from cte; 

Hinweis: Dies setzt voraus, dass column2 zwei Zeichen hat (wie in Ihren Beispieldaten). Wenn dies variieren kann, können Sie auch charindex() verwenden, um den Split col23 zu erhalten.

+0

ich diesen Fehler "nach links oder String-Funktion übergaben ungültige Längenparameter" bekam –

+0

@drummerboi Hier ist eine Arbeitsversion, die auf Gordons Antwort basiert: http://rexttester.com/NDQ10805 – SqlZim

+0

@SqlZim - vielen Dank, es funktioniert ....... !!!!!!!! Yeeeeeeey! –

2

eine CSV-Splitter Funktion von Jeff Moden Verwendung zusammen mit left() und substring():

select 
    Id 
, col2 = left(x.Item,charindex('(',x.Item)-1) 
, col3 = substring(x.Item 
      ,charindex('(',x.Item)+1 
      ,charindex(')',x.Item)-charindex('(',x.Item)-1 
     ) 
from t 
    cross apply (
    select Item = ltrim(rtrim(i.Item)) 
     from [dbo].[delimitedsplit8K](t.col,',') as i 
    ) x 

kehrt:

Testaufbau: http://rextester.com/IOKB65736

+------+------+------+ 
| Id | col2 | col3 | 
+------+------+------+ 
| 1000 | SA | 13 | 
| 1000 | DS | 1 | 
| 2000 | QW | 1 | 
| 3000 | TE | 23 | 
| 3000 | RE | 1 | 
| 3000 | BB | 40 | 
| 3000 | VV | 5 | 
+------+------+------+ 

Splitting Saiten Referenz:

+0

Dies sind großartige Links! – ATC

+0

Gibt es eine Abfrage, die keine Funktion benötigt, habe ich keinen Zugriff auf eine Funktion in unserer Datenbank ausführen –

+0

@drummerboi [Gordon Linoffs Antwort] (http://Stackoverflow.com/a/42456086/2333499) nicht erfordern eine Funktion. – SqlZim

Verwandte Themen