将字符串拆分为新列

时间:2015-05-20 13:16:05

标签: sql sql-server

有一栏包含以下内容: abcd/ef/g/hij/之间的字符是动态无法修复的。 我想将select内容分成4个单独的新列。

已经回答的问题不同,我想将/分隔的字符串中的内容拆分为新列。

3 个答案:

答案 0 :(得分:3)

您可以使用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

答案 1 :(得分: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 :(得分:0)

您需要使用CHARINDEX找到/字符的位置,并以此方式对字符串进行切片。它将是一个很大的表达式,因为要找到第三个斜杠,你需要使用CHARINDEX的第3个参数,传递另一个CHARINDEX的结果,它也使用了第三个参数。除了最后一个(第四个)片段之外,您还需要使用CHARINDEX在下一个斜杠后查找和删除文本。

这样的东西将在第三个斜杠之后提取文本:

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

我把剩下的留给你了。