1

我有一个包含IDand的表Value,其中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 中做到这一点?

4

3 回答 3

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  
于 2013-09-18T10:16:07.520 回答
1

请试试:

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 小提琴演示

于 2013-09-18T11:01:49.407 回答
1

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

SELECT  ID,s.value FROM dbo.TableName t
outer apply STRING_SPLIT(t.Value, ' ') s
于 2020-05-13T14:41:24.017 回答