如何将列中的多个逗号分隔值拆分为新列

时间:2016-07-06 13:22:22

标签: sql-server string split

我遇到了和以前一样的问题 'How to split a comma-separated value to columns' ,但我的解决方案代码需要更灵活。

我有多个(N)列,逗号分隔值。 E.G。:

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)

1 个答案:

答案 0 :(得分: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