2015-05-20 123 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) 

我离开其余的你。