代码之家  ›  专栏  ›  技术社区  ›  Abu Hassan

连续拆分SQL server 2012中的字符串

  •  4
  • Abu Hassan  · 技术社区  · 6 年前

    字符串位于

    @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)
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   John Cappelletti    6 年前

    假设值为1-5。这可以很容易地通过一点XML和一个交叉应用程序来实现

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

    编辑-更改为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