2012-07-27 74 views
0

如何獲取其值爲逗號分隔符的列的每個值?獲取替換逗號分隔符的列的值

例子:

ID ColumnUnified 
1 12,34,56,78 
2 80,99,70,56 

我要的是一個查詢來獲取數量,而不逗號。如果可能的話,在collumns中。

12 34  56 78 
+0

始終將4個值用逗號分隔,野外? – 2012-07-27 12:59:25

+2

您的數據庫結構違反了第一條規範化規則。你最好重新設計你的數據庫。 – 2012-07-27 13:00:36

+0

有一個類似的問題在這裏..... http://stackoverflow.com/questions/697519/split-function-equivalent-in-tsql – 2012-07-27 13:00:52

回答

0

該解決方案Madhivanan的鏈接指向的工作是非常有創意,但我有一個小問題,它的SQL Server 2012相關的一個名稱列(開始)。我在他的答案中修改了代碼,使用StartPos而不是Start作爲列名。

我對系統程序spt_values並不熟悉,但是對於那些對此解決方案的工作原理感興趣的人,我發現了一個非常豐富的description of the procedure here on SO

最後,這裏是從Madhivana的回答(略)修改後的代碼:

CREATE TABLE #test(id int, data varchar(100)) 

INSERT INTO #test VALUES (1,'This,is,a,test,string') 
INSERT INTO #test VALUES (2,'See,if,it,can,be,split,into,many,columns') 

DECLARE @pivot varchar(8000) 
DECLARE @select varchar(8000) 

SELECT @pivot = COALESCE(@pivot + ',', '') + '[col' 
     + CAST(number + 1 AS VARCHAR(10)) + ']' 
FROM master..spt_values 
WHERE type = 'p' 
     AND number <= (SELECT MAX(LEN(data) - LEN(REPLACE(data, ',', ''))) 
         FROM #test 
        ) 

SELECT @select = ' 
    select p.* 
    from (
    select 
    id,substring(data, StartPos+2, endPos-StartPos-2) as token, 
    ''col''+cast(row_number() over(partition by id order by StartPos) as varchar(10)) as n 
    from (
    select 
    id, data, n as StartPos, charindex('','',data,n+2) endPos 
    from (select number as n from master..spt_values where type=''p'') num 
    cross join 
    (
    select 
    id, '','' + data +'','' as data 
    from 
    #test 
    ) m 
    where n < len(data)-1 
    and substring(data,n+1,1) = '','') as data 
    ) pvt 
    Pivot (max(token)for n in (' + @pivot + '))p' 

EXEC(@select) 

DROP TABLE #test