sql - How to create rows based on one column values comma seperated -
begin tran create table #user_det (user_id varchar(50), emp_id int, role varchar(500)) insert #user_det (user_id , emp_id , role) select 'sankar', 431544 , '(developer),(dba),(designer)' union select 'gowri', 145721 , '(dba),(designer)' union select 'raja', 101010 , 'all' select * #user_det drop table #user_det rollback output required: =============== select 'sankar' user_id ,431544 emp_id ,'developer' role union select 'sankar' user_id ,431544 emp_id ,'dba' role union select 'sankar' user_id ,431544 emp_id ,'designer' role union select 'gowri' user_id ,145721 emp_id ,'dba' role union select 'gowri' user_id ,145721 emp_id ,'designer' role union select 'raja' user_id ,101010 emp_id ,'all' role
in sql server 2016+ can use string_split().
in sql server pre-2016, using csv splitter table valued function jeff moden:
select user_id, emp_id, role = replace(replace(s.item,'(',''),')','') #user_det u cross apply dbo.delimitedsplit8k(u.role,',') s rextester demo: http://rextester.com/yvxgu42109
returns:
+---------+--------+-----------+ | user_id | emp_id | role | +---------+--------+-----------+ | sankar | 431544 | developer | | sankar | 431544 | dba | | sankar | 431544 | designer | | gowri | 145721 | dba | | gowri | 145721 | designer | | raja | 101010 | | +---------+--------+-----------+ splitting strings reference:
- tally oh! improved sql 8k “csv splitter” function - jeff moden
- splitting strings : follow-up - aaron bertrand
- split strings right way – or next best way - aaron bertrand
string_split()in sql server 2016 : follow-up #1 - aaron bertrand
delimitedsplit8k function jeff moden: create function [dbo].[delimitedsplit8k] ( @pstring varchar(8000) , @pdelimiter char(1) ) returns table schemabinding return e1(n) ( select 1 union select 1 union select 1 union select 1 union select 1 union select 1 union select 1 union select 1 union select 1 union select 1 ) , e2(n) (select 1 e1 a, e1 b) , e4(n) (select 1 e2 a, e2 b) , ctetally(n) ( select top (isnull(datalength(@pstring),0)) row_number() on (order (select null)) e4 ) , ctestart(n1) ( select 1 union select t.n+1 ctetally t substring(@pstring,t.n,1) = @pdelimiter ) , ctelen(n1,l1) ( select s.n1, isnull(nullif(charindex(@pdelimiter,@pstring,s.n1),0)-s.n1,8000) ctestart s ) select itemnumber = row_number() over(order l.n1) , item = substring(@pstring, l.n1, l.l1) ctelen l ; go
Comments
Post a Comment