Sql 拆分字符串而不拆分字符串(Sever 2012)
我想知道是否有可能将字符串拆分为不同的列 首先,我有一个表tabOld,它包含: 名称 5522-rep___;-4210-03-test-434907-emn-nt.pdfSql 拆分字符串而不拆分字符串(Sever 2012),sql,sql-server,tsql,split,Sql,Sql Server,Tsql,Split,我想知道是否有可能将字符串拆分为不同的列 首先,我有一个表tabOld,它包含: 名称 5522-rep___;-4210-03-test-434907-emn-nt.pdf 假设您总是需要通过在-上拆分name列中的第三个子字符串,那么您确实可以使用前面文章中基于XML的解决方案 我使用了一些CTE(公共表表达式)来隔离子查询 样本数据 create table tabOld ( name nvarchar(200) ); insert into tabOld (name) values
假设您总是需要通过在
-
上拆分name
列中的第三个子字符串,那么您确实可以使用前面文章中基于XML的解决方案
我使用了一些CTE(公共表表达式)来隔离子查询
样本数据
create table tabOld
(
name nvarchar(200)
);
insert into tabOld (name) values
('5522-rep__-4210-03-test-434907-emn-nt.pdf');
create table tabNew
(
name nvarchar(200),
num int
);
解决方案
with cteXml as
(
select old.name,
convert(xml, '<r>'+replace(old.name, '-', '</r><r>')+'</r>') as XMLCol
from tabOld old
),
cteSplit as
(
select cx.name,
row_number() over(order by (select null)) as Num,
n.r.value('.', 'nvarchar(200)') as SubStr
from cteXml cx
cross apply cx.XMLCol.nodes('r') as n(r)
)
insert into tabNew (name, num)
select cs.name,
convert(int, cs.SubStr)
from cteSplit cs
where cs.Num = 3;
要查看实际情况。请尝试下面的查询
select name, SUBSTRING(rst, 1, patindex('%[-]%',rst)-1) as Number
from (
select name, SUBSTRING(name, patindex('%[-][0-9]%',name)+1, 100) rst
from tabOld old
)a
你做了什么研究?你试了什么?它在哪里不起作用?这是一个很常见的问题。我不明白这里的逻辑。在这里,你需要更加明确。
STRING\u SPLIT
在基于分隔符将字符串拆分为行时,与问题有什么关系。这似乎根本不是你想要的。想要的分割背后的逻辑是什么?所需的数字是否始终位于同一位置(字符串的长度,在出现-或其他x之后)?如果是这样的话,您应该查看一下子字符串
,它看起来更适合手头的任务……我认为您将其视为一个以连字符分隔的字符串,并且始终希望提取第二个连字符和第三个连字符之间的子字符串。对吗?您是否反对按照链接的标题所示为此创建函数?您可能会发现这很有帮助:
select name, SUBSTRING(rst, 1, patindex('%[-]%',rst)-1) as Number
from (
select name, SUBSTRING(name, patindex('%[-][0-9]%',name)+1, 100) rst
from tabOld old
)a