2015-05-20 170 views
0

列中包含以下內容。 abcd/ef/g/hij/之間的字符未動態修復。 我想在選擇查詢中將內容分成4個獨立的新列。將字符串拆分爲新列

已經回答的問題是不同的,我想將由/分隔的字符串中的內容拆分成新的列。

+1

你會一直擁有3個''''你的字符串中的列數還可以動態嗎? – ughai

+0

你能給出一個樣本數據和預期的輸出嗎? – artm

+0

我會一直有3 /。所以列數量正在修復 –

回答

0

如果你問我,最快特設的方法是把你的數據轉換成XML,並使用nodes()方法:

declare @temp table (data nvarchar(max)) 

insert into @temp 
select 'abcd/ef/g/hij' union all 
select '1/2/3' 

select t.data, n.c.value('.', 'nvarchar(max)') 
from @temp as t 
    outer apply (select cast('<t>' + replace(t.data, '/', '</t><t>') + '</t>' as xml) as data) as d 
    outer apply d.data.nodes('t') as n(c) 
2

您可以使用REPLACE'.'更換'/'。然後使用PARSENAME拿到繩子的獨立部分:

CREATE TABLE #tmp (str VARCHAR(50)) 

INSERT INTO #tmp VALUES 
('abcd/ef/g/hij'), 
('1111111/222/33/4444') 

SELECT PARSENAME(x.s, 4) AS [1], PARSENAME(x.s, 3) AS [2], 
     PARSENAME(x.s, 2) AS [3], PARSENAME(x.s, 1) AS [4] 
FROM #tmp 
CROSS APPLY (SELECT REPLACE(str, '/', '.')) AS x(s) 

輸出:

1  2 3 4 
--------------------- 
abcd ef g hij 
1111111 222 33 4444 
+0

列中分發它,儘管我不會使用它,因爲它不應該執行OP所需的操作。它不會工作超過4個部分,它也可能返回不正確的結果像[[a]/[a]/[a]/[asd]' –

+1

@羅馬字符串狀態:*我將始終有3/*(見註釋),唯一的問題是如果'str'列中有'。',但是也有一個解決方法(.i.e在替換''/''s之前用一個特殊的不存在的字符替換''。'')。 –

+0

'[''符號將由您的解決方案刪除? –

0

你需要找到使用CHARINDEX的/字符的位置,切片串起來的方式。這將是一個很大的表達式,因爲要找到第三個斜槓,您需要使用CHARINDEX的第三個參數,傳遞另一個CHARINDEX的結果,該CHARINDEX也具有正在使用的第三個參數。除了最後一個(第四個)片段之外,還需要使用CHARINDEX在下一個斜線後查找和刪除文本。

像這樣的事情會在第三個斜槓後提取文本:

RIGHT(s, CHARINDEX('/', s, CHARINDEX('/', s, CHARINDEX('/', s)+1)+1)+1) 

我離開其餘的你。