所以我有这个代码在双分隔符上精确分割4个值,它完美地工作,但我无法绕过如何分割5个值 这是我的字符串
@string = 'Value1|Value2|Value3|Value4|Value5, OtherVal1|OtherVal2|OtherVal3|OtherVal4|OtherVal5'
这是我分割4个值的代码
WITH cte
AS (SELECT Replace(Rtrim(Ltrim(split.a.value('.', 'VARCHAR(100)'))), '|','.') AS split_data
FROM (SELECT Cast ('<M>' + Replace(@string, ',', '</M><M>')
+ '</M>' AS XML) AS Data) AS A
CROSS apply data.nodes ('/M') AS Split(a))
SELECT COLUMN2= Parsename(split_data, 4),
COLUMN3=Parsename(split_data, 3),
COLUMN4= Parsename(split_data, 2),
COLUMN5=Parsename(split_data, 1)
FROM cte
我如何将它分成5个??
答案 0 :(得分:0)
第一眼看......
似乎,您必须使用CTE两次。第一个 - 获得&#34;行&#34; (按,
拆分数据)和第二个 - 得到&#34; colums&#34; (按|
拆分数据)。然后你必须PIVOT数据以表格形式显示它们;)
看看例子:
DECLARE @string VARCHAR(MAX) = 'Value1|Value2|Value3|Value4|Value5, OtherVal1|OtherVal2|OtherVal3|OtherVal4|OtherVal5'
;WITH MyRows AS
(
SELECT 1 AS RowNo, LEFT(@string, CHARINDEX(', ', @string)-1) AS MyVals, RIGHT(@string, LEN(@string) - CHARINDEX(', ', @string)) AS Remainder
WHERE CHARINDEX(', ', @string)>0
UNION ALL
SELECT RowNo + 1 AS RowNo, LEFT(Remainder, CHARINDEX(', ', Remainder)) AS MyVals, RIGHT(Remainder, LEN(Remainder) - CHARINDEX(', ', Remainder)) AS Remainder
FROM MyRows
WHERE CHARINDEX(', ', Remainder)>0
UNION ALL
SELECT RowNo + 1 AS RowNo, Remainder AS MyVals, NULL AS Remainder
FROM MyRows
WHERE CHARINDEX(', ', Remainder)=0
),
MyCols AS
(
SELECT RowNo, 1 AS ColNumber, LEFT(MyVals, CHARINDEX('|', MyVals)-1) AS SingleValue, RIGHT(MyVals, LEN(MyVals) - CHARINDEX('|', MyVals)) AS Remainder
FROM MyRows
WHERE CHARINDEX('|', MyVals)>0
UNION ALL
SELECT RowNo, ColNumber + 1 AS ColNumber, LEFT(Remainder, CHARINDEX('|', Remainder)-1) AS SingleValue, RIGHT(Remainder, LEN(Remainder) - CHARINDEX('|', Remainder)) AS Remainder
FROM MyCols
WHERE CHARINDEX('|', Remainder)>0
UNION ALL
SELECT RowNo, ColNumber + 1 AS ColNumber, Remainder AS SingleValue, NULL AS Remainder
FROM MyCols
WHERE CHARINDEX('|', Remainder)=0
)
SELECT RowNo, [1],[2],[3],[4],[5]
FROM (
SELECT ColNumber, SingleValue, RowNo
FROM MyCols ) AS DT
PIVOT(Max(SingleValue) FOR ColNumber IN([1],[2],[3],[4],[5])) AS PT
结果:
RowNo 1 2 3 4 5
1 Value1 Value2 Value3 Value4 Value5
2 OtherVal1 OtherVal2 OtherVal3 OtherVal4 OtherVal5