2017-08-08 77 views
1

所以我的问题如下: - 我有多个字符串,其中可变数量的分隔符,分隔符之间的文本也可以不同: -MSSQL如何从第三个分隔符的右边选择字符串(从右边开始计算)

fug\klde\hzt\jkljlkjlkjl\hgftb\jghgf\ooorr\ter\fdgd 
wegf\df\jght\kfd\dfgert 

我需要做的是把绳剪断,只留下自例子如下: -

ooorr\ter\fdgd 
jght\kfd\dfgert 

所以基本上从右侧第三个分隔符。 我已经能够使用RIGHT,CHARINDEX和REVERSE来给我字符串的最后部分,但我为其余部分挣扎着。 任何帮助,将不胜感激提前。

+0

请告诉我们你的企图。 –

回答

0

文字处理,你可能需要在表现层,但天真的方式做事情是做象下面这样:如下

Select Substring(col1, len(col1) - CharIndex('\', reverse(col1), Charindex('\',reverse(col1),charindex('\', reverse(col1),1)+1)+1)+2, len(col1)) from #delimiterdata 

输出:

+-----------------+ 
|  Output  | 
+-----------------+ 
| ooorr\ter\fdgd | 
| jght\kfd\dfgert | 
+-----------------+ 
0

另一种选择是用一个小的XML与aa交叉应用

示例

Declare @YourTable table (ID int,SomeCol varchar(max)) 
Insert Into @YourTable values 
(1,'fug\klde\hzt\jkljlkjlkjl\hgftb\jghgf\ooorr\ter\fdgd') 
,(2,'wegf\df\jght\kfd\dfgert') 
,(3,'kfd\dfgert')    

Select A.ID 
     ,NewValue = reverse(Concat(Pos1,'\'+Pos2,'\'+Pos3)) 
From @YourTable A 
Cross Apply (
       Select Pos1 = n.value('/x[1]','varchar(max)') 
         ,Pos2 = n.value('/x[2]','varchar(max)') 
         ,Pos3 = n.value('/x[3]','varchar(max)') 
       From (Select Cast('<x>' + replace((Select replace(reverse(A.SomeCol),'\','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) n) X 
      ) B 

返回

ID NewValue 
1 ooorr\ter\fdgd 
2 jght\kfd\dfgert 
3 kfd\dfgert  --<<Note: Doesn't have 3 but will produce the last two 
+0

虽然这些都是非常好的解决方案,但我发现John Cappelletti的答案对我来说是最好的,因为添加或减少分隔符的数量很容易。非常感谢!! –

+0

@CraigRobinson乐于帮助 –

0

使用NGrams8K你可以这样做:

-- sample data 
declare @yourtable table (someId int identity, someString varchar(1000)); 
insert @yourtable 
values ('fug\klde\hzt\jkljlkjlkjl\hgftb\jghgf\ooorr\ter\fdgd'),('wegf\df\jght\kfd\dfgert'); 

with stringPrep AS 
(
    select 
    someId, 
    someString, 
    dPos = ROW_NUMBER() OVER (partition by t.someid order by ng.position desc), 
    position 
    from @yourtable t 
    cross apply dbo.NGrams8k(t.someString, 1) ng 
    where token = '\' 
) 
select 
    someId, 
    someString, 
    newString = substring(someString, position+1, 1000) 
from stringPrep 
where dpos = 3; 

结果

someId someString             newString 
------- ------------------------------------------------------------ ----------------- 
1  fug\klde\hzt\jkljlkjlkjl\hgftb\jghgf\ooorr\ter\fdgd   ooorr\ter\fdgd 
2  wegf\df\jght\kfd\dfgert          jght\kfd\dfgert 
相关问题