2012-11-19 69 views
1

我有一個包含4個組件的庫存字段,每個組件都由「 - 」分隔。我不確定如何使用charindex來解析字符串,以便我爲每個在delmiters之間找到的值返回一個列。例如:字段值或字符串=項目顏色大小形狀。如何從分隔字符串創建多列

我的目標是結束一個項目作爲列,顏色作爲列,大小作爲列和最終形狀。

+1

可能重複http://stackoverflow.com/questions/13159526/split-values-over-多行) – Taryn

+2

不是真的重複。似乎我們需要每個分隔符列,而不是行。 –

回答

1

如果是最多4列,你可以嘗試這樣的:

declare @Table table (SomeColumn varchar(100)); 
insert into @Table 
    select 'ball-blue-small-round' union all 
    select 'ball-red-small-round' union all 
    select 'ball-green-small-round' union all 
    select 'ball---square'   union all 
    select '----'; 

;with stage (s) 
as ( select replace(SomeColumn, '-', '.') 
     from @Table 
    ) 
select [item] = parsename(s,4), 
     [color] = parsename(s,3), 
     [size] = parsename(s,2), 
     [shape] = parsename(s,1) 
from stage; 

如果> 4,請回復,我們可以在一個更加動態的解決方案工作。

+0

對於遲到的回覆,我表示歉意,但正在處理另一部分內容。我不明白你的選擇和聯盟是什麼意思。我對這些東西很陌生。 – user131602

+0

我現在明白了,你正在創建一個測試表。它剛剛在我身上曙光..我現在正在嘗試解決方案。 – user131602

+0

數據列向右傾斜,第一列返回空值 – user131602

0

使用交叉APPLYs(用於理解冗長的名字) -

declare @Table table (SomeColumn varchar(100)); 
insert into @Table 
select 'ball-Orange-small-round' union all 
select 'bat-blue-medium-square' union all 
select 'stumps-green-large-rectangle' 

SELECT * FROM @Table 

SELECT Sub1.FirstSub1 AS Item 
     ,Sub2.SecondSub1 AS Color 
     ,Sub3.ThirdSub1 AS Size 
     ,SubAfterThirdHyphen AS Shape 

FROM @Table 
CROSS APPLY (SELECT CHARINDEX('-',SomeColumn) AS FirstHyphenPos) AS Pos1 
CROSS APPLY (SELECT SUBSTRING(SomeColumn,1,FirstHyphenPos-1) AS FirstSub1) AS Sub1 
CROSS APPLY (SELECT SUBSTRING(SomeColumn,FirstHyphenPos+1,LEN(SomeColumn)) AS SubAfterFirstHyphen) AS Substr1 

CROSS APPLY (SELECT CHARINDEX('-',Substr1.SubAfterFirstHyphen) AS SecondHyphenPos) AS Pos2 
CROSS APPLY (SELECT SUBSTRING(Substr1.SubAfterFirstHyphen,1,SecondHyphenPos-1) AS SecondSub1) AS Sub2 
CROSS APPLY (SELECT SUBSTRING(Substr1.SubAfterFirstHyphen,SecondHyphenPos+1,LEN(Substr1.SubAfterFirstHyphen)) AS SubAfterSecondHyphen) AS Substr2 

CROSS APPLY (SELECT CHARINDEX('-',Substr2.SubAfterSecondHyphen) AS ThirdHyphenPos) AS Pos3 
CROSS APPLY (SELECT SUBSTRING(Substr2.SubAfterSecondHyphen,1,ThirdHyphenPos-1) AS ThirdSub1) AS Sub3 
CROSS APPLY (SELECT SUBSTRING(Substr2.SubAfterSecondHyphen,ThirdHyphenPos+1,LEN(Substr2.SubAfterSecondHyphen)) AS SubAfterThirdHyphen) AS Substr3 
[在多行分割值(的
+0

SQL小提琴 - http://www.sqlfiddle.com/#!3/91c28/1 – Narsimha

+0

我正在嘗試您的解決方案。非常感謝你的迴應者 – user131602

相關問題