sql在分隔符上拆分5个值

时间:2016-04-10 09:45:04

标签: sql string split common-table-expression delimiter

所以我有这个代码在双分隔符上精确分割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个??

1 个答案:

答案 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