MSSQL将逗号分隔的字符串转换成列显⽰
你这个不属于SSIS的范畴,可以说是TSQL范畴.
这种东西不适合⽤SSIS来做,每样⼯具都有⾃⼰的优势,如果运⽤好它们让它们做⾃⼰擅长的事才是你应该学习的。
这⾥的话你可以这样解,思路如下:
1. 为了能将 aaa,bbb 拆分开,你可以通过 CROSS JOIN的⽅式来实现。
2. 为了能够CROSS JOIN你必须要创建⼏⾏虚拟⾏,利⽤ SQL系统表来创建虚拟⾏
3. 虚拟⾏创建完毕后,利⽤CROSS JOIN的⽅式达到根据有⼏个 “,”号来拆⼏⾏
4. 完成后就会出现重复的⾏,也就是说如果你是"aa,bb,cc"这样的情况,那么就有3⾏数据并且它们的数据⼀模⼀样
5. 使⽤SUBSTRING 和 CHARINDEX 来根据ID号来选择要第⼏个逗号后⾯的字符
6. 最终完成
以下是完整TSQL: 可以直接Ctrl+C Ctrl+V 到你的SSMS⾥执⾏
IF OBJECT_ID('Test1') IS NOT NULL DROP TABLE Test1
GO
CREATE TABLE Test1(ID varchar(3), [Value] varchar(8))
INSERT INTO Test1(ID, [Value])
SELECT 1, 'aa,bb'
UNION ALL
SELECT 2, 'cc,dd,ee'
GO
SELECT ID, SUBSTRING([Value], b.number, CHARINDEX(',', [Value] + ',', b.number)-b.number) AS [Value]
FROM Test1 a, master..spt_values b
WHERE
b.number >= 1 AND b.number < LEN(a.[Value]) pe='P' AND SUBSTRING(',' + [Value] ,number,1) = ','
原表
1 aa,bb
2 cc,dd,ee
现在
1 aa
1 bb
2 cc
2 dd
2 ee
表A
xm        xk
张三语⽂,历史,⾳乐
李四体育,语⽂
现在想查询得到
xm        xk
张三语⽂
张三历史
张三⾳乐
李四体育
李四语⽂
1Select
2    a.xm,xk=substring(a.xk,b.number,charindex(',',a.xk+',',b.number)-b.number)
3from
4表A a join master..spt_values  b
pe='p'AND b.number BETWEEN1AND LEN(a.xk)
6where
7substring(','+a.xk,b.number,1)=','
--1.将字符串转换为列显⽰
if object_id('tb') is not null drop table tb
go
create table tb([编号]varchar(3),[产品]varchar(2),[数量]int,[单价]int,[⾦额]int,[序列号]varchar(8))
insert into tb([编号],[产品],[数量],[单价],[⾦额],[序列号])
select'001','AA',3,5,15,'12,13,14'union all
select'002','BB',8,9,13,'22,23,24'
go
select[编号],[产品],[数量],[单价],[⾦额]
,substring([序列号],b.number,charindex(',',[序列号]+',',b.number)-b.number) as[序列号]
from tb a with(nolock),master..spt_values b with(nolock)
where b.number>=1and b.number<=len(a.[序列号]) pe='P'
and substring(','+[序列号],number,1)=','
go
drop table tb
go
/**
编号产品数量单价⾦额序列号
---- ---- ----------- ----------- ----------- --------
001  AA  3          5          15          12
001  AA  3          5          15          13
001  AA  3          5          15          14
002  BB  8          9          13          22
怎么不显示tablet002  BB  8          9          13          23
002  BB  8          9          13          24
*/
-
---------
--7.将字符串显⽰为⾏列
if object_id('tb') is not null
  drop table tb
create table tb
(
  id int identity(1,1),
  s nvarchar(100)
)
insert into tb(s) select'车位地址1,车位状况1|车位地址2,车位状况2|车位地址n,车位状况n';
with cte as(
  select substring(s,number,charindex('|',s+'|',number)-number) as ss
    from tb with(nolock),master..spt_values with(nolock)
      where type='P'and number>=1and number<=len(s) and substring('|'+s,number,1)='|' )
select left(ss,charindex(',',ss)-1)as s1,substring(ss,charindex(',',ss)+1,len(ss))as s2 from cte; drop table tb
/**
s1            s2
----------- ------------
车位地址1      车位状况1
车位地址2      车位状况2
车位地址n      车位状况n

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。