SQL实现将数据表中的字段中的值按分隔符分成多列

SQL实现将数据表中的字段中的值按分隔符分成多列


原始表格

在这里插入图片描述

工作需求:将上表的class_all字段的数据已分号进行分割,生成下表:


在这里插入图片描述

1. 建表


建表SQL:

CREATE TABLE [dbo].[test_table](
	[id] nvarchar(max)  NOT NULL,
	[class_all] nvarchar(max) NULL
)


2. 插入数据


insert into test_table VALUES ('1','111;222;333');
insert into test_table VALUES ('2','444;555');
insert into test_table VALUES ('3','');

3. 需求分析


根据class_all字段已分号进行分割,然后一个类别一个分组,并且前面是对应的id


4. 实现代码


只需要修改表名,查询字段1,分割字段,结果字段名 ,分隔符即可!!!

WITH 表名 
AS 
( 
	SELECT 
	查询字段1,
	结果字段名 = CAST(LEFT(REPLACE(分割字段, ' ', ''),CHARINDEX('分隔符',REPLACE(分割字段,' ', '') + '分隔符')-1) AS NVARCHAR(MAX)) ,
	Split = CAST(STUFF(REPLACE(分割字段, ' ', '') + '分隔符',1,CHARINDEX('分隔符',REPLACE(分割字段, ' ','') + '分隔符'), '') AS NVARCHAR(MAX))
	FROM dbo.表名 
	WHERE 分割字段 IS NOT NULL
UNION ALL
	SELECT       
	查询字段1,
	结果字段名 = CAST(LEFT(Split,CHARINDEX('分隔符', Split) - 1) AS NVARCHAR(MAX)) ,
	Split = CAST(STUFF(Split, 1, CHARINDEX('分隔符', Split), '') AS NVARCHAR(MAX))
	FROM 表名 
	WHERE Split > ''
)
SELECT 查询字段1,结果字段名 FROM 表名

5. 案例代码


WITH test_table -- 表名
AS 
( 
	SELECT 
	id,
	class = CAST(LEFT(REPLACE(class_all, ' ', ''),CHARINDEX(';',REPLACE(class_all,' ', '') + ';')-1) AS NVARCHAR(MAX)) ,
	Split = CAST(STUFF(REPLACE(class_all, ' ', '') + ';',1,CHARINDEX(';',REPLACE(class_all, ' ','') + ';'), '') AS NVARCHAR(MAX))
	FROM dbo.test_table
	WHERE class_all IS NOT NULL
UNION ALL
	SELECT       
	id,
	class = CAST(LEFT(Split,CHARINDEX(';', Split) - 1) AS NVARCHAR(MAX)) ,
	Split = CAST(STUFF(Split, 1, CHARINDEX(';', Split), '') AS NVARCHAR(MAX))
	FROM test_table
	WHERE Split > ''
)
SELECT id,class FROM test_table

6. 实现效果


效果如下:


在这里插入图片描述

  • 8
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

袁袁袁袁满

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值