相关文章推荐
跑龙套的皮蛋  ·  PostgreSQL遍历Record各例的值 ...·  2 月前    · 
低调的打火机  ·  SQL ...·  2 月前    · 
爱旅游的盒饭  ·  编写国际化 Transact-SQL 语句 ...·  1 月前    · 
忧郁的日光灯  ·  在Ubuntu中安装basemap模块时出现 ...·  1 年前    · 
路过的酱肘子  ·  Z%E5%BD%A9%E7%A5%A8%E6 ...·  1 年前    · 
销魂的小熊猫  ·  matlab colorbar ...·  1 年前    · 
一身肌肉的莲藕  ·  Python中调用PowerShell、远程 ...·  1 年前    · 
气势凌人的伤疤  ·  java代码覆盖度之jacoco - ...·  1 年前    · 
Code  ›  如何将带有逗号分隔符的行中的多个值转换为多列?开发者社区
select 分隔符 varchar
https://cloud.tencent.com/developer/ask/sof/105397791
任性的蘑菇
1 年前
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
提问

问 如何将带有逗号分隔符的行中的多个值转换为多列?

Stack Overflow用户
提问于 2017-07-16 17:08:20
EN

如何将SQL Server中行中的多个逗号分隔值转换为多列,就像我有一个包含两行的表一样

A1,1,B1,2 
C1,3,D4,4  

我想要这样的输出

col1 col2 col3 col4
 A1   1     B1   2
 C1   3     D4   4
1 189 0 票数 1
EN
sql
sql-server
tsql

回答 1

Stack Overflow用户

发布于 2017-07-17 00:16:57

如果您有有限或最大列数,另一种选择

示例

Declare @YourTable Table ([YourCol] varchar(50))
Insert Into @YourTable Values 
 ('A1,1,B1,2')
,('C1,3,D4,4')
Select B.*
 From @YourTable A
 Cross Apply (
                Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
                      ,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
                      ,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
                      ,Pos4 = ltrim(rtrim(xDim.value('/x[4]','varchar(max)')))
                      ,Pos5 = ltrim(rtrim(xDim.value('/x[5]','varchar(max)')))
                      ,Pos6 = ltrim(rtrim(xDim.value('/x[6]','varchar(max)')))
                From  (Select Cast('<x>' + replace((Select replace(A.YourCol,',','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as x
             ) B

返回

Pos1    Pos2    Pos3    Pos4    Pos5    Pos6
A1      1       B1      2       NULL    NULL
C1      3       D4      4       NULL    NULL

编辑-只是为了好玩,这里是上述 的动态版本

只需将 YourTable 替换为实际的表名称,将 YourCol 替换为所需的要拆分的列。

Declare @SQL nvarchar(max)
Set @SQL = Stuff((Select concat(',Col',N,' = ltrim(rtrim(xDim.value(''/x[',N,']'',''varchar(max)'')))') 
                   From  (
                           Select Top ((Select max(len(YourCol)-len(replace(YourCol,',','')))+1 From YourTable)) 
                                  N=Row_Number() Over (Order By (Select NULL)) 
                            From  master..spt_values
                    For XML Path ('')),1,1,'')
Set @SQL = '
Select A.*,B.*
 From  YourTable A
 
推荐文章
跑龙套的皮蛋  ·  PostgreSQL遍历Record各例的值[遍历表的行和列]_postgresql record
2 月前
低调的打火机  ·  SQL Server下字符串,整数转换成16进制字符串的方法-阿里云开发者社区
2 月前
爱旅游的盒饭  ·  编写国际化 Transact-SQL 语句 - SQL Server | Microsoft Learn
1 月前
忧郁的日光灯  ·  在Ubuntu中安装basemap模块时出现“ModuleNotFoundError: No module named 'mpl_toolkits.basemap'”的错误。
1 年前
路过的酱肘子  ·  Z%E5%BD%A9%E7%A5%A8%E6%BA%90%E7%A0%81%E7%A8%8B%E5%BA%8F%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%行业资讯 - X-MOL
1 年前
销魂的小熊猫  ·  matlab colorbar 设置显示范围_matlab colormap 范围_早起CaiCai的博客-CSDN博客
1 年前
一身肌肉的莲藕  ·  Python中调用PowerShell、远程执行bat文件实例_PowerShell_脚本之家
1 年前
气势凌人的伤疤  ·  java代码覆盖度之jacoco - 奔跑的小小鱼 - 简书
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号