How to split a comma-separated value to columns

后端 未结 30 4647
刺人心
刺人心 2020-11-21 04:38

I have a table like this

Value   String
-------------------
1       Cleo, Smith

I want to separate the comma delimited string into two colu

30条回答
  •  萌比男神i
    2020-11-21 04:53

    question is simple, but problem is hot :)

    So I create some wrapper for string_split() which pivot result in more generic way. It's table function which returns values (nn, value1, value2, ... , value50) - enough for most CSV lines. If there are more values, they will wrap to next line - nn indicate line number. Set third parameter @columnCnt = [yourNumber] to wrap at specific position:

    alter FUNCTION fn_Split50
    (   
        @str varchar(max),
        @delim char(1), 
        @columnCnt int = 50
    )
    RETURNS TABLE 
    AS
    RETURN 
    (
        SELECT * 
        FROM (SELECT 
                nn = (nn - 1) / @columnCnt + 1, 
                nnn = 'value' + cast(((nn - 1) % @columnCnt) + 1 as varchar(10)), 
                value
            FROM (SELECT 
                nn = ROW_NUMBER() over (order by (select null)),
                value
                FROM string_split(@str, @delim) aa
                ) aa
            where nn > 0
        ) bb
        PIVOT  
        (  
        max(value) 
        FOR nnn IN (    
            value1, value2, value3, value4, value5, value6, value7, value8, value9, value10,
            value11, value12, value13, value14, value15, value16, value17, value18, value19, value20,
            value21, value22, value23, value24, value25, value26, value27, value28, value29, value30,
            value31, value32, value33, value34, value35, value36, value37, value38, value39, value40,
            value41, value42, value43, value44, value45, value46, value47, value48, value49, value50        
         )  
        ) AS PivotTable 
    )
    

    Example of using:

    select * from dbo.fn_split50('zz1,aa2,ss3,dd4,ff5', ',', DEFAULT)
    

    select * from dbo.fn_split50('zz1,aa2,ss3,dd4,ff5,gg6,hh7,jj8,ww9,qq10', ',', 3)
    

    select * from dbo.fn_split50('zz1,11,aa2,22,ss3,33,dd4,44,ff5,55,gg6,66,hh7,77,jj8,88,ww9,99,qq10,1010', ',',2)
    

    Hope, it will helps :)

提交回复
热议问题