2017-08-08 75 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 
相關問題