有一栏包含以下内容: abcd/ef/g/hij
。
/
之间的字符是动态无法修复的。
我想将select内容分成4个单独的新列。
已经回答的问题不同,我想将/
分隔的字符串中的内容拆分为新列。
答案 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)
我把剩下的留给你了。