【问题标题】:Split string in SQL server 2012 in a row在 SQL Server 2012 中连续拆分字符串
【发布时间】:2018-10-26 20:54:46
【问题描述】:

字符串在

@txt nvarchar(max)='2450,10,54,kb2344,kd5433;87766,500,100,ki5332108,ow092827'

我想要这样的输出:

Id. Val1. Val2. Val3. Val4. Val5.
1. 2450 10 54 kb2344 kd5433.
2. 87766 500 100 ki5332108 ow09287

有人可以建议怎么做吗?

我用谷歌搜索,找到了这个解决方案。但这是两个逗号分隔的值,但在我的情况下有五个:

 DECLARE @Var NVARCHAR(100) = '2450,10,54,kb2344,kd5433;87766,500,100,ki5332108,ow092827'
 SELECT LEFT(@Var, CHARINDEX(';', @Var) - 1) ,SUBSTRING(@Var, CHARINDEX(';', @Var) + 1, LEN(@Var)- LEN(LEFT(@Var, CHARINDEX(';', @Var)))- LEN(RIGHT(@Var, CHARINDEX(';', REVERSE(@Var))))) AS [Job] , RIGHT(@Var, CHARINDEX(';', REVERSE(@Var))-1)

【问题讨论】:

    标签: sql-server string split delimiter


    【解决方案1】:

    假设值为 1-5。这可以通过与 CROSS APPLY 配合使用的一点 XML 轻松完成

    如果数字列是可变的,则必须使用 DYNAMIC。

    编辑 - 更改为 nvarchar

    示例

    Declare @txt  nvarchar(max)='2450,10,54,kb2344,kd5433;87766,500,100,ki5332108,ow092827'
    
    Select ID=A.RetSeq
          ,B.*
     From (
            Select RetSeq = Row_Number() over (Order By (Select null)) 
                  ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'nvarchar(max)')))
            From  (Select x = Cast('<x>' + replace(@txt ,';','</x><x>')+'</x>' as xml).query('.')) as A 
            Cross Apply x.nodes('x') AS B(i)
          ) A
     Cross Apply (
                    Select Val1 = ltrim(rtrim(xDim.value('/x[1]','nvarchar(max)')))
                          ,Val2 = ltrim(rtrim(xDim.value('/x[2]','nvarchar(max)')))
                          ,Val3 = ltrim(rtrim(xDim.value('/x[3]','nvarchar(max)')))
                          ,Val4 = ltrim(rtrim(xDim.value('/x[4]','nvarchar(max)')))
                          ,Val5 = ltrim(rtrim(xDim.value('/x[5]','nvarchar(max)')))
                    From  (Select Cast('<x>' + replace(A.RetVal,',','</x><x>')+'</x>' as xml) as xDim) as B1
                 ) B
    

    退货

    ID  Val1    Val2    Val3    Val4        Val5
    1   2450    10      54      kb2344      kd5433
    2   87766   500     100     ki5332108   ow092827
    

    【讨论】:

    • @AbuHassan 乐于助人
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    相关资源
    最近更新 更多