我遇到了和以前一样的问题 '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)
答案 0 :(得分:3)
试试这样:
可能需要使用LTRIM(RTRIM(...))
包装所有输出列以消除尾随空格。
如果你希望它们在你的字符串中,可能有必要替换邪恶的三个字符(<>;
应该是< > and &
)
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