2016-07-06 70 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