Sql 如何基于逗号分隔的一列值创建行
在SQL Server 2016+中,您可以使用字符串分割 在2016年之前的SQL Server中,使用Jeff Moden提供的CSV拆分器表值函数:Sql 如何基于逗号分隔的一列值创建行,sql,sql-server,Sql,Sql Server,在SQL Server 2016+中,您可以使用字符串分割 在2016年之前的SQL Server中,使用Jeff Moden提供的CSV拆分器表值函数: Begin tran create table #user_det (user_id varchar(50), emp_id int, role varchar(500)) insert into #user_det (user_id , emp_id , role) select 'Sankar', 4315
Begin tran
create table #user_det
(user_id varchar(50), emp_id int, role varchar(500))
insert into #user_det (user_id , emp_id , role)
select 'Sankar', 431544 , '(Developer),(DBA),(Designer)'
union all
select 'Gowri', 145721 , '(DBA),(Designer)'
union all
select 'Raja', 101010 , 'ALL'
select * from #user_det
drop table #user_det
Rollback
OutPut Required:
===============
select 'Sankar' as user_id ,431544 as emp_id ,'Developer' as Role
union all
select 'Sankar' as user_id ,431544 as emp_id ,'DBA' as Role
union all
select 'Sankar' as user_id ,431544 as emp_id ,'Designer' as Role
union all
select 'Gowri' as user_id ,145721 as emp_id ,'DBA' as Role
union all
select 'Gowri' as user_id ,145721 as emp_id ,'Designer' as Role
union all
select 'Raja' as user_id ,101010 as emp_id ,'ALL' as Role
+---------+--------+-----------+
| user_id | emp_id | Role |
+---------+--------+-----------+
| Sankar | 431544 | Developer |
| Sankar | 431544 | DBA |
| Sankar | 431544 | Designer |
| Gowri | 145721 | DBA |
| Gowri | 145721 | Designer |
| Raja | 101010 | ALL |
+---------+--------+-----------+
rextester演示:
返回:
select user_id, emp_id, Role = replace(replace(s.Item,'(',''),')','')
from #user_det u
cross apply dbo.delimitedsplit8K(u.role,',') s
拆分字符串引用:
Jeff Moden的delimitedsplit8K函数:
Begin tran
create table #user_det
(user_id varchar(50), emp_id int, role varchar(500))
insert into #user_det (user_id , emp_id , role)
select 'Sankar', 431544 , '(Developer),(DBA),(Designer)'
union all
select 'Gowri', 145721 , '(DBA),(Designer)'
union all
select 'Raja', 101010 , 'ALL'
select * from #user_det
drop table #user_det
Rollback
OutPut Required:
===============
select 'Sankar' as user_id ,431544 as emp_id ,'Developer' as Role
union all
select 'Sankar' as user_id ,431544 as emp_id ,'DBA' as Role
union all
select 'Sankar' as user_id ,431544 as emp_id ,'Designer' as Role
union all
select 'Gowri' as user_id ,145721 as emp_id ,'DBA' as Role
union all
select 'Gowri' as user_id ,145721 as emp_id ,'Designer' as Role
union all
select 'Raja' as user_id ,101010 as emp_id ,'ALL' as Role
+---------+--------+-----------+
| user_id | emp_id | Role |
+---------+--------+-----------+
| Sankar | 431544 | Developer |
| Sankar | 431544 | DBA |
| Sankar | 431544 | Designer |
| Gowri | 145721 | DBA |
| Gowri | 145721 | Designer |
| Raja | 101010 | ALL |
+---------+--------+-----------+
每个人都应该有一个好的拆分/解析函数,就像SqlZim链接到的那样 如果您不想或不能使用UDF,这里有另一个选项
create function [dbo].[delimitedsplit8K] (
@pstring varchar(8000)
, @pdelimiter char(1)
)
returns table with schemabinding as
return
with e1(N) as (
select 1 union all select 1 union all select 1 union all
select 1 union all select 1 union all select 1 union all
select 1 union all select 1 union all select 1 union all select 1
)
, e2(N) as (select 1 from e1 a, e1 b)
, e4(N) as (select 1 from e2 a, e2 b)
, ctetally(N) as (
select top (isnull(datalength(@pstring),0))
row_number() over (order by (select null)) from e4
)
, ctestart(N1) as (
select 1 union all
select t.N+1 from ctetally t where substring(@pstring,t.N,1) = @pdelimiter
)
, ctelen(N1,L1) as (
select s.N1,
isnull(nullif(charindex(@pdelimiter,@pstring,s.N1),0)-s.N1,8000)
from ctestart s
)
select itemnumber = row_number() over(order by l.N1)
, item = substring(@pstring, l.N1, l.L1)
from ctelen l
;
go
返回
你好,谢谢你的回答。但我需要在SQLServer2012版本中使用它。你能帮忙吗me@SankarM这适用于sql server 2012。如果你在2016年,这张便条是为另一个选择而写的。好的,明白了。非常感谢。有没有可能在不使用该函数的情况下写入单个查询?@SankarM,您应该使用它