前言
多行数据转成一列
一列数据,如逗号隔开,转多条记录
一、多行转成一列,以逗号隔开
示例:
create table userinfo(
name varchar(100)
)
insert into userinfo(name) values('陈某某')
insert into userinfo(name) values('王某某')
-- 未转前的记录
select * from userinfo
-- stuff 去掉第一个逗号
select stuff((
-- 多行转成一列,以逗号隔开
select ',' + cast(name as varchar(10)) from userinfo
for xml path('') ),1,1,'') as 中奖名单
效果:
二、一列转多行
通过切割达到实现目的
1.引入库
代码如下(示例):
-- 切割
select * from f_split('陈某某,王某某',',')
-- 运用场景
select *,'' 其它字段1,'' 其它字段2 from userinfo where name in(select value from f_split('陈某某,王某某',','))
2.创建切割函数
代码如下(示例):
CREATE FUNCTION [dbo].[F_Split]
(
@SplitString nvarchar(max), --源字符串
@Separator nvarchar(10)=' ' --分隔符号,默认为空格
)
RETURNS @SplitStringsTable TABLE --输出的数据表
(
[id] int identity(1,1),
[value] nvarchar(max)
)
AS
BEGIN
DECLARE @CurrentIndex int;
DECLARE @NextIndex int;
DECLARE @ReturnText nvarchar(max);
SELECT @CurrentIndex=1;
WHILE(@CurrentIndex<=len(@SplitString))
BEGIN
SELECT @NextIndex=charindex(@Separator,@SplitString,@CurrentIndex);
IF(@NextIndex=0 OR @NextIndex IS NULL)
SELECT @NextIndex=len(@SplitString)+1;
SELECT @ReturnText=substring(@SplitString,@CurrentIndex,@NextIndex-@CurrentIndex);
INSERT INTO @SplitStringsTable([value]) VALUES(@ReturnText);
SELECT @CurrentIndex=@NextIndex+1;
END
RETURN;
END
效果: