在SQL Server中拆分以空格分隔的值列表

时间:2013-09-18 10:10:03

标签: sql sql-server

我有一个包含IDValue的表格,其中Value字段是以空格分隔的值列表:

ID           Value   
100           A1 A2 A3     
200           B1           
300           C1 C2

我想拆分值字符串,并将每个字符串作为一个具有ID的单独行:

ID          Value
100           A1           
100           A2          
100           A3           
200           B1           
300           C1          
300           C2 

如何在T-SQL中执行此操作?

3 个答案:

答案 0 :(得分:4)

您可以使用自定义Split功能和CROSS APPLY

SELECT ID, Split.Item As Value
FROM dbo.TableName
CROSS APPLY dbo.Split(Value, ' ')as Split

DEMO

但最好规范化您的数据库并使用单独的表将ID与值链接。

我使用了这个表值函数:

CREATE FUNCTION [dbo].[Split]
(
    @ItemList NVARCHAR(MAX), 
    @delimiter CHAR(1)
)
RETURNS @ItemTable TABLE (Item VARCHAR(250))  
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 @ItemTable(Item) VALUES(@Item)
        IF @i = 0
            SET @tempItemList = ''
        ELSE
            SET @tempItemList = RIGHT(@tempItemList, LEN(@tempItemList) - @i)
        SET @i = CHARINDEX(@delimiter, @tempItemList)
    END 
    RETURN
END  

答案 1 :(得分:1)

SQL Server 2016及更高版本具有STRING_SPLIT()函数,可根据指定的分隔符将字符串拆分为一行子字符串。因此,对于您的问题,您只需执行以下操作即可:

SELECT  ID,s.value FROM dbo.TableName t
outer apply STRING_SPLIT(t.Value, ' ') s

答案 2 :(得分:0)

请尝试:

SELECT 
     ID, 
    Split.a.value('.', 'VARCHAR(100)') AS [Value]
FROM  
(
     SELECT
        ID,
        CAST ('<M>' + REPLACE(Value, ' ', '</M><M>') + '</M>' AS XML) AS CVS  
    FROM YourTable
) AS A CROSS APPLY CVS.nodes ('/M') AS Split(a)

SQL Fiddle Demo