Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 拆分字符串而不拆分字符串(Sever 2012)_Sql_Sql Server_Tsql_Split - Fatal编程技术网

Sql 拆分字符串而不拆分字符串(Sever 2012)

Sql 拆分字符串而不拆分字符串(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

我想知道是否有可能将字符串拆分为不同的列

首先,我有一个表tabOld,它包含:

名称 5522-rep___;-4210-03-test-434907-emn-nt.pdf
假设您总是需要通过在
-
上拆分
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