說我有一個返回以下拆分逗號分隔字符串錶行到使用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看起來如何實現這一目標?
說我有一個返回以下拆分逗號分隔字符串錶行到使用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看起來如何實現這一目標?
或者,你可以使用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)
這是使用XML的最簡單的例子,我在迄今爲止在這個網站的各種答案中見過。謝謝! – 4AM
偉大的解決方案!我已經調整了您的答案,以處理我正在處理的項目沒有分隔符的字符串。 –
您使用cross apply
。事情是這樣的:
select t.id, s.val as SomeValue
from table t cross apply
dbo.split(SomeValue, ',') as s(val);
你能分享你使用的「dbo.split」功能嗎? – B3S
@ B3S。 。 。 SQL Server在2016年提供了一個。否則,你可以通過谷歌搜索「SQL Server split」輕鬆獲得它們。 –
好吧,使用正確的sys函數是'STRING_SPLIT',而不是'dbo.split'。 https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql – GoldBishop
我知道這是一個老的文章,但我想補充我的解決方案,這樣我可以在將來找到它。我不得不做點小文章,以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)
感謝您查看此標記,但是您是否嘗試過測試我的解決方案以獲取沒有分隔符的值?您會注意到我的解決方案通過在CAST表達式中添加'
嗯,我得到一個錯誤(更可能是一個數據問題,現在我想起它),我緊迫的時間,我只需要爲我做這個工作。我會在下週再試一次,並讓你知道。 –
這個問題已經被問和回答了一個極大倍。 –
[Tsql拆分字符串]可能的重複(http://stackoverflow.com/questions/10914576/tsql-split-string) –
@AlvinThompson我相信它實際上已經幾次brazillion時間;-)。 –