从表中的列创建查找表

时间:2013-02-13 14:27:43

标签: sql sql-server tsql xpath

我在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可能是解决这个问题的方法。有没有人有任何示例代码可以做到这一点?

由于

3 个答案:

答案 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或者甚至是早期版本都可以完成同样的工作。