2017-04-21 124 views
0

我的数据是这样的拉括号中的最右边的字符串

ABCD.(123).(456) 
789.(DEF) JKL.MNO 
(PQ).(RS).(TUV)||(WXYz) 

我期待拉从最右边括号括号中的字符串。结果看起来像这样

(456) 
(DEF) 
(WXYz) 

圆括号内的整个字符串和字符串可能会有所不同。它的子字符串和charindex的一些组合,但我无法弄清楚。

+0

你正在使用哪个RDMS? –

+0

Management Studio 2016 – baineschile

+0

仅供参考 - 此数据全部在一列中。 – baineschile

回答

1

这样的问题表明数据结构存在问题 - 该字符串实际上由多个项目组成。但是,有时这样的字符串处理是必要的。

下面的方法应该工作,假设括号内的组件总是存在:

select t.*, colparen 
from t cross apply 
    (values (right(col, charindex('(', reverse(col)) - 1)) v(colr) cross apply 
    (values (charindex(colr, charindex(')', col) + 1)) v(colparen) 
+0

COLPAREN和COLPARENT是什么意思? – baineschile

+0

@baineschile。 。 。 'colparen'只是结果列的名称。 –

0

既然你是2016年,你可以使用String_Split()在演唱会与跨应用

注意:如果没有观测值并且想要显示空值,请使用外部应用。

Declare @YourTable table (SomeCol varchar(100)) 
Insert Into @YourTable values 
('ABCD.(123).(456)'), 
('789.(DEF).JKL.MNO'), 
('(PQ).(RS).(TUV).(WXYz)') 


Select B.Value 
From @YourTable A 
Cross Apply (
       Select Top 1 * 
        ,RN=Row_Number() over (Order By (Select Null)) 
       From String_Split(A.SomeCol,'.') 
       Where Value Like '(%)' 
       Order by 2 Desc 
      ) B 

返回

Value 
(456) 
(DEF) 
(WXYz) 

dbFiddle

0
select REVERSE(substring(reverse('ABCD.(123).(456)'),CHARINDEX(')',reverse('ABCD.(123).(456)')),CHARINDEX('(',reverse('ABCD.(123).(456)')))) 

这应该得到哟你想要什么