如何在sqlserver中将CSV与另一列一起选择成行

时间:2013-06-14 14:14:31

标签: sql-server sql-server-2008

我在表格中有类似下列数据:

id    str
--    --------------------
 1    123,456,234
 2    17,54,22
 3    4,7
 4    432
 5    1,82,2

我想要一个SELECT语句,它将分配id和str值。例如,我想要上面示例中的以下输出:

id     str
--     ----------
 1     123
 1     456
 1     234
 2     17
 2     54

etc

如何在sqlserver 2008中获得此结果?

1 个答案:

答案 0 :(得分:3)

您可以使用Split功能。我正在使用这个:

CREATE FUNCTION [dbo].[Split]
(
    @ItemList NVARCHAR(MAX), 
    @delimiter CHAR(1)
)
RETURNS @IDTable TABLE (Item VARCHAR(50))  
AS      

BEGIN    
    DECLARE @tempItemList NVARCHAR(MAX)
    SET @tempItemList = @ItemList

    DECLARE @i INT    
    DECLARE @Item NVARCHAR(4000)

    SET @tempItemList = REPLACE (@tempItemList, ' ', '')
    SET @i = CHARINDEX(@delimiter, @tempItemList)

    WHILE (LEN(@tempItemList) > 0)
    BEGIN
        IF @i = 0
            SET @Item = @tempItemList
        ELSE
            SET @Item = LEFT(@tempItemList, @i - 1)
        INSERT INTO @IDTable(Item) VALUES(@Item)
        IF @i = 0
            SET @tempItemList = ''
        ELSE
            SET @tempItemList = RIGHT(@tempItemList, LEN(@tempItemList) - @i)
        SET @i = CHARINDEX(@delimiter, @tempItemList)
    END 
    RETURN
END  

现在您可以使用CROSS APPLY

SELECT Id, Item As Str
FROM dbo.TableName
CROSS APPLY dbo.Split(str, ',')

INNER JOIN vs. CROSS APPLY

DEMO包含您的示例数据。

ID  STR
1   123
1   456
1   234
2   17
2   54
2   22
3   4
3   7
4   432
5   1
5   82
5   2