列中包含以下内容。 abcd/ef/g/hij
。 /
之间的字符未动态修复。 我想在选择查询中将内容分成4个独立的新列。将字符串拆分为新列
已经回答的问题是不同的,我想将由/
分隔的字符串中的内容拆分成新的列。
列中包含以下内容。 abcd/ef/g/hij
。 /
之间的字符未动态修复。 我想在选择查询中将内容分成4个独立的新列。将字符串拆分为新列
已经回答的问题是不同的,我想将由/
分隔的字符串中的内容拆分成新的列。
如果你问我,最快特设的方法是把你的数据转换成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)
您可以使用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
列中分发它,尽管我不会使用它,因为它不应该执行OP所需的操作。它不会工作超过4个部分,它也可能返回不正确的结果像[[a]/[a]/[a]/[asd]' –
@罗马字符串状态:*我将始终有3/*(见注释),唯一的问题是如果'str'列中有'。',但是也有一个解决方法(.i.e在替换''/''s之前用一个特殊的不存在的字符替换''。'')。 –
'[''符号将由您的解决方案删除? –
你需要找到使用CHARINDEX的/字符的位置,切片串起来的方式。这将是一个很大的表达式,因为要找到第三个斜杠,您需要使用CHARINDEX的第三个参数,传递另一个CHARINDEX的结果,该CHARINDEX也具有正在使用的第三个参数。除了最后一个(第四个)片段之外,还需要使用CHARINDEX在下一个斜线后查找和删除文本。
像这样的事情会在第三个斜杠后提取文本:
RIGHT(s, CHARINDEX('/', s, CHARINDEX('/', s, CHARINDEX('/', s)+1)+1)+1)
我离开其余的你。
你会一直拥有3个''''你的字符串中的列数还可以动态吗? – ughai
你能给出一个样本数据和预期的输出吗? – artm
我会一直有3 /。所以列数量正在修复 –