2015-06-18 230 views
2
單獨行

說我有一個返回以下拆分逗號分隔字符串錶行到使用TSQL

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

ID的查詢要退貨如下:

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

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

+2

這個問題已經被問和回答了一個極大倍。 –

+0

[Tsql拆分字符串]可能的重複(http://stackoverflow.com/questions/10914576/tsql-split-string) –

+0

@AlvinThompson我相信它實際上已經幾次brazillion時間;-)。 –

回答

5

或者,你可以使用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) 
+1

這是使用XML的最簡單的例子,我在迄今爲止在這個網站的各種答案中見過。謝謝! – 4AM

+0

偉大的解決方案!我已經調整了您的答案,以處理我正在處理的項目沒有分隔符的字符串。 –

1

您使用cross apply。事情是這樣的:

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

你能分享你使用的「dbo.split」功能嗎? – B3S

+0

@ B3S。 。 。 SQL Server在2016年提供了一個。否則,你可以通過谷歌搜索「SQL Server split」輕鬆獲得它們。 –

+0

好吧,使用正確的sys函數是'STRING_SPLIT',而不是'dbo.split'。 https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql – GoldBishop

0

我知道這是一個老的文章,但我想補充我的解決方案,這樣我可以在將來找到它。我不得不做點小文章,以Stephan's解決方案以解決不包含分隔符值:

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) 
+0

感謝您查看此標記,但是您是否嘗試過測試我的解決方案以獲取沒有分隔符的值?您會注意到我的解決方案通過在CAST表達式中添加''和''來解決這個問題,因此無論是否存在任何分隔符都可以工作。你的工作,但我相信它增加了不必要的工作 – Stephan

+0

嗯,我得到一個錯誤(更可能是一個數據問題,現在我想起它),我緊迫的時間,我只需要爲我做這個工作。我會在下週再試一次,並讓你知道。 –