2016-07-06 91 views
0

我 「How to split a comma-separated value to columns」 得到了相同/相似的問題,但我的解決方案的代碼需要更加靈活。如何拆分逗號分隔的多個值,它是成列的新列

我得到了逗號分隔值的多個(N)列。 EG:

Column1  Column2 
====================== 
a1, a2, a3  er, asw, as 
a2, a3   qwe, qw 

我現在需要的是這樣的

Column1_1 Column1_2 Columm1_3 Column2_1 Column2_2 Column2_3 
================================================================== 
a1  a2  a3   er  asw  as 
a2  a3  NULL  qwe  qw  NULL 

所以取決於列的「最長」(大多數用英文逗號分隔值),我需要使用相同的名稱和索引(這裏的新欄目1-3)。如果一個單元格小於最大值(例如,在這種情況下爲2),則剩餘的新列不應包含任何空值的值。

我希望有人能幫助我!

非常感謝!編號:
我試過使用這段代碼。它的工作原理,到目前爲止,但其不靈活,只有採取一列,而不是「N列」

DECLARE @xml xml 

SELECT @xml = (
SELECT CAST(
'<i id="' + CAST(COLUMN1 as nvarchar(10)) + '"><w>' + REPLACE(NID,' ','</w> <w>') + '</w></i>' as xml) 
FROM table4 
FOR XML PATH('') 
) 

SELECT 
    t.v.value('w[1]','nvarchar(100)') as String1, 
    t.v.value('w[2]','nvarchar(100)') as String2, 
    t.v.value('w[3]','nvarchar(100)') as String3, 
    t.v.value('w[4]','nvarchar(100)') as String4, 
    t.v.value('w[5]','nvarchar(100)') as String5, 
    t.v.value('w[6]','nvarchar(100)') as String6, 
    t.v.value('w[7]','nvarchar(100)') as String7 
FROM @xml.nodes('/i') as t(v) 
+0

你嘗試過什麼來解決這個問題?你有一個好的起點,那麼什麼讓你失望? – dfundako

+0

在您的列中計算逗號以查找最大值。添加到剩餘逗號的列。之後,請聯繫你的兩欄,並使用你的鏈接中描述的方法。 – xdd

+2

希望這是一個正常化項目。如果沒有,你需要閱讀規範化,因爲存儲這樣的分隔數據違反了1NF,並導致無數痛苦的工作。 –

回答

3

試試這樣說:

這可能需要換用LTRIM(RTRIM(...))所有輸出列擺脫尾隨空格。

如果你期望他們成爲你的字符串中,可能有必要更換邪惡的三個大字,(<>;應該&lt; &gt; and &amp;

DECLARE @tbl TABLE(Column1 VARCHAR(100),Column2 VARCHAR(100)); 
INSERT INTO @tbl VALUES 
('a1, a2, a3','er, asw, as') 
,('a2, a3','qwe, qw'); 

WITH Splitted AS 
(
    SELECT CAST('<x>' + REPLACE(Column1,',','</x><x>') + '</x>' AS XML) Col1Xml 
      ,CAST('<x>' + REPLACE(Column2,',','</x><x>') + '</x>' AS XML) Col2Xml 
    FROM @tbl 
) 
SELECT Col1Xml.value('/x[1]','varchar(max)') AS Column1_1 
     ,Col1Xml.value('/x[2]','varchar(max)') AS Column1_2 
     ,Col1Xml.value('/x[3]','varchar(max)') AS Column1_3 
     ,Col2Xml.value('/x[1]','varchar(max)') AS Column2_1 
     ,Col2Xml.value('/x[2]','varchar(max)') AS Column2_2 
     ,Col2Xml.value('/x[3]','varchar(max)') AS Column2_3 
FROM Splitted