需要拆分列值

时间:2015-06-11 18:56:24

标签: sql sql-server split sql-server-2012

我有一张下表

id  name    total
1   a         2
2   b         3
3   c,d,e,f   15

预期产出: -

id  name    total
1   a        2
2   b        3
3   c        15
4   d        15
5   e        15
5   f        15

我尝试过分割功能和XML,但没有用。

2 个答案:

答案 0 :(得分:1)

因为你没有指定数据库名称,假设SQL SERVER。你可以尝试这个。

Working Example

SELECT A.[id],
     Split.a.value('.', 'VARCHAR(100)') AS String,A.total  
 FROM  (SELECT [id], 
               CAST ('<M>' + REPLACE([name], ',', '</M><M>') + '</M>' AS XML) AS String ,
               [total]  
        FROM  #t) AS A 
 CROSS APPLY String.nodes ('/M') AS Split(a); 

请参阅此article

答案 1 :(得分:0)

您使用的是哪个版本的SQL?

split函数用于分割文本字符串,但您要求的是对表格本身格式的更改。

你的表有一个id = 3,name = c,d,e,f,total = 15的元组。

如果你想要id = 3,name = c等等,你必须改变数据。

从问题的表达方式来看,它意味着您希望以不同的方式呈现数据,但id是用于区分数据库中行的定义列。

您可以自动生成一个新表,在这种情况下,split语句可用于将每个元素从逗号分隔的记录中删除。

一旦你有了这个项目列表,假设你的id字段是一个标识字段(自动递增),你就可以为每个元素运行一个insert语句。

您可能能够使用内部选择来获取您正在寻找的那种输出,该内部选择将逗号分隔的值列表拆分,但您需要一些过程SQL(或T-SQL ...您没有指定您的SQL服务器)迭代值并将它们插入到新表中。 如果你确实沿着这条路线前进,那么必须抛弃id值,你会将列表视为原始数据集。

编辑:“没有显示名称”发布的示例与您将获得表单中的数据的距离非常接近。 名称“c”,“d”,“e”和“f”的ID都是3,但您的格式非常接近。