将连接字段拆分为单独的部分

时间:2010-08-05 19:58:41

标签: sql sql-server tsql sql-server-2008 function

使用SQL Server 2008时,我尝试执行类似于this帖子的操作,该操作涉及将连接字段拆分为单独的部分以用于规范化目的。

链接帖子中解决方案的问题在于它们仅适用于分隔值。

我试图分割的数据类似于:

UserID - ConcatField
1 - ABC
2 - DEF

我希望输出如下:

UserID - ConcatField
1 - A
1 - B
1 - C
2 - D
2 - E
2 - F

是否有一个函数可以在不使用分隔符的情况下拆分这些值?

3 个答案:

答案 0 :(得分:1)

Jeff Moden在SQL Server Central上有一篇关于Tally Tables的优秀文章,其中包括一个关于如此分割字符串的部分。下面列出的第二篇文章是使用Tally Table更深入地了解字符串。

http://www.sqlservercentral.com/articles/T-SQL/62867/

http://www.sqlservercentral.com/articles/Tally+Table/70738/

(需要免费订阅)

答案 1 :(得分:0)

查看TSQL中可用的字符串函数:http://msdn.microsoft.com/en-us/library/ms181984.aspx

在表格中加载原始数据后,您可以使用以下功能相对容易地将它们分开:
* CHARINDEX
* SUBSTRING
* LEN
* LEFT& RIGHT

实际的实现当然取决于数据本身,但是在分割记录之后(可能多次处理它们,首先提取C,然后是B,然后从1 - ABC中提取A),你应该好好去

答案 2 :(得分:0)

这是你的意思吗?

WITH X AS
(
SELECT 1 AS UserID,'ABC' AS ConcatField UNION ALL
SELECT 2 AS UserID,'DEF' AS ConcatField
), N AS
     (SELECT 1 i
     UNION ALL
     SELECT i+1
     FROM   N
     WHERE  i<1000 /*Or whatever your max string length is*/
     )

SELECT UserID,SUBSTRING(ConcatField,i,1) as ConcatField
 INTO #NewTemporaryTable
 FROM X JOIN N  ON I<= LEN(ConcatField)
OPTION(MAXRECURSION 0)

给出

UserID      ConcatField
----------- -----------
1           A
1           B
1           C
2           D
2           E
2           F

编辑尽管正如Jeff Moden在评论中指出的那样,递归CTE的表现远非如此,因此您最好使用其中一种技术创建永久数字表{{3}然后使用

SELECT  UserID ,
        SUBSTRING(ConcatField, i, 1) AS ConcatField
INTO    #NewTemporaryTable
FROM    YourTable
        JOIN Numbers ON Number <= LEN(ConcatField)
相关问题