【问题标题】:sql split 5 values on delimitersql在分隔符上拆分5个值
【发布时间】:2016-04-10 09:45:03
【问题描述】:

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

【问题讨论】:

  • 不就是加个 COLUMNX = Parsename(split_data, 5), ?
  • @Turo 没有。 parsename 只能使用 4 个部分。
  • 您需要将字符串拆分为行,然后将拆分结果转为列。顺便说一句,这是另一个例子,为什么你不应该在 sql 中使用分隔数据。
  • @ZoharPeled 那我该怎么做呢?感谢您的宝贵时间
  • 我很傻,但是您可以编写一个存储函数,根据需要使用分隔符和位置进行拆分

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


【解决方案1】:

乍一看...

看来,您必须使用CTE 两次。第一个 - 获取“行”(由, 分割数据)和第二个 - 获取“列”(由| 分割数据)。然后你必须PIVOT data 以表格形式显示它们;)

看看例子:

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

【讨论】:

    猜你喜欢
    • 2017-05-06
    • 1970-01-01
    • 2021-06-14
    • 2021-06-23
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    相关资源
    最近更新 更多