SQL Server : Split string to row

前端 未结 3 1027
一整个雨季
一整个雨季 2020-12-18 14:34

How to turn data from below:

CODE COMBINATION   USER
1111.111.11.0      KEN; JIMMY
666.778.0.99       KEN
888.66.77.99       LIM(JIM); JIMMY
<
3条回答
  •  悲哀的现实
    2020-12-18 15:08

    With this TVF, you can supply the string to be split and delimiter. Furthermore, you get the sequence number which can be very useful for secondary processing.

    Select [CODE COMBINATION]
          ,[USER] = B.RetVal
     From  YourTable A
     Cross Apply [dbo].[udf-Str-Parse](A.[USER],';') B
    

    Returns

    The Parse UDF

    CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimiter varchar(10))
    Returns Table 
    As
    Return (  
        Select RetSeq = Row_Number() over (Order By (Select null))
              ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
        From (Select x = Cast(''+ Replace(@String,@Delimiter,'')+'' as xml).query('.')) as A 
        Cross Apply x.nodes('x') AS B(i)
    );
    --Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',')
    --Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ')
    

    Now, another option is the Parse-Row UDF. Notice we return the parsed string in one row. Currently 9 positions, but it is easy to expand or contract.

    Select [CODE COMBINATION]
          ,B.*
     From  YourTable A
     Cross Apply [dbo].[udf-Str-Parse-Row](A.[USER],';') B
    

    Returns

    The Parse Row UDF

    CREATE FUNCTION [dbo].[udf-Str-Parse-Row] (@String varchar(max),@Delimiter varchar(10))
    Returns Table 
    As
    Return (
        Select Pos1 = xDim.value('/x[1]','varchar(max)')
              ,Pos2 = xDim.value('/x[2]','varchar(max)')
              ,Pos3 = xDim.value('/x[3]','varchar(max)')
              ,Pos4 = xDim.value('/x[4]','varchar(max)')
              ,Pos5 = xDim.value('/x[5]','varchar(max)')
              ,Pos6 = xDim.value('/x[6]','varchar(max)')
              ,Pos7 = xDim.value('/x[7]','varchar(max)')
              ,Pos8 = xDim.value('/x[8]','varchar(max)')
              ,Pos9 = xDim.value('/x[9]','varchar(max)')
         From (Select Cast('' + Replace(@String,@Delimiter,'')+'' as XML) as xDim) A
    )
    --Select * from [dbo].[udf-Str-Parse-Row]('Dog,Cat,House,Car',',')
    --Select * from [dbo].[udf-Str-Parse-Row]('John Cappelletti',' ')
    

提交回复
热议问题