我在SQL Server中有一个包含ID
的表,还有一个由逗号分隔的多个值的列(如下例所示)
ID Category_number
-------------------------
1 3,5,6,8
2 4,8,23
3 4,7,5,3
我需要将它变成一个每行有1个类别编号的查找表,如下所示;
ID Category_Number
-------------------------
1 3
1 5
1 6
我被告知XPATH可能是解决这个问题的方法。有没有人有任何示例代码可以做到这一点?
由于
答案 0 :(得分:2)
请参阅此回答Split
在数据库中创建该功能。
然后您可以使用以下方法创建所需的结果:
SELECT
ID,
A.S Category_Number
FROM
MyCsvTable
CROSS APPLY dbo.Split (',', MyCsvTable.Category_Number) A
答案 1 :(得分:2)
我知道您刚刚接受了解决方案,但假设您正在使用SQL Server,这里有一种替代方法,但没有构建函数:
SELECT A.[id],
Split.a.value('.', 'VARCHAR(100)') AS Cat
FROM
(SELECT [id],
CAST ('<M>' + REPLACE(Cat, ',', '</M><M>') + '</M>' AS XML) AS String
FROM YourTable
) AS A
CROSS APPLY String.nodes ('/M') AS Split(a)
还有一些小提琴:http://sqlfiddle.com/#!3/cf427/3
祝你好运!
答案 2 :(得分:0)
您可能还想检查SQL SERVER中的HierarchyID。一些教程:http://www.codeproject.com/Articles/37171/HierarchyID-Data-Type-in-SQL-Server-2008
基本上你需要做的就是遍历字符串并找到逗号的位置并用chr(13)等替换它们。在Oracle中,可以在单个查询中轻松完成。我认为从2008年开始使用SQL Server中的HierarchyID或者甚至是早期版本都可以完成同样的工作。