簡體   English   中英

使用TSQL將逗號分隔的字符串表行拆分為單獨的行

[英]Split comma separated string table row into separate rows using TSQL

假設我有一個返回以下內容的查詢

ID       SomeValue
1        a,b,c,d
2        e,f,g

我想返回如下:

ID       SomeValue
1        a
1        b
1        c
1        d
2        e
2        f
2        g

我已經有一個UDF調用Split,它將接受一個字符串和一個分隔符,並將其作為一個名為[Value]的列的表返回。 鑒於此,SQL看起來如何實現這一目標?

或者,您可以像這樣使用XML:

DECLARE @yourTable TABLE(ID INT,SomeValue VARCHAR(25));

INSERT INTO @yourTable
VALUES  (1,'a,b,c,d'),
        (2,'e,f,g');

WITH CTE
AS
(
    SELECT  ID,
            [xml_val] = CAST('<t>' + REPLACE(SomeValue,',','</t><t>') + '</t>' AS XML)
    FROM @yourTable
)

SELECT  ID,
        [SomeValue] = col.value('.','VARCHAR(100)')
FROM CTE
CROSS APPLY [xml_val].nodes('/t') CA(col)

你使用cross apply 像這樣的東西:

select t.id, s.val as SomeValue
from table t cross apply
     dbo.split(SomeValue, ',') as s(val);

我知道這是一篇較舊的帖子,但我想添加我的解決方案,以便將來能夠找到它。 我不得不對Stephan的解決方案稍作調整,以考慮不包含分隔符的值:

DECLARE @yourTable TABLE(ID INT,SomeValue VARCHAR(25));

INSERT INTO @yourTable
VALUES  (1,'a,b,c,d'),
        (2,'e'),
        (3,'f'),
        (4,'g,h,i');

WITH CTE
AS
(
    SELECT  ID,
            [xml_val] = CAST('<t>' +
                                CASE WHEN  CHARINDEX(',', SomeValue) > 0
                                    THEN REPLACE(SomeValue,',','</t><t>') 
                                    ELSE SomeValue
                                END + '</t>' AS XML)
    FROM @yourTable
)

SELECT  ID,
        [SomeValue] = col.value('.','VARCHAR(100)')
FROM CTE
CROSS APPLY [xml_val].nodes('/t') CA(col)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM