MSSQL如何从第三个分隔符的右边选择字符串(从右边算起)

时间:2017-08-08 15:03:15

标签: sql-server string tsql

所以我的问题如下: - 我有多个带有可变数量分隔符的字符串,分隔符之间的文本也可以有所不同: -

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

我需要做的是剪切字符串,只留下示例中的以下内容: -

ooorr\ter\fdgd
jght\kfd\dfgert

所以基本上是右边的第三个分隔符。 我已经能够使用RIGHT,CHARINDEX和REVERSE来给我字符串的最后一部分,但我正在努力完成剩下的工作。 任何帮助将提前感谢。

3 个答案:

答案 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 |
+-----------------+

答案 1 :(得分:0)

另一个选择是使用一个小的XML与一个Cross Apply

一起使用

示例

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 

答案 2 :(得分: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