2016-09-28 76 views
6

我试图从我的字符串中提取最后一个单词。从我的字符串中提取最后两个单词

输入字符串:GGG_FFFF_AAAA_BBBBBB_CCC_DDDDD

结果

╔═══════════╦════════════╗ 
║ FIRST_COL ║ SECOND_COL ║ 
╠═══════════╬════════════╣ 
║ CCC  ║ DDDDD  ║ 
╚═══════════╩════════════╝ 

我有下面的代码工作。

DECLARE @STR VARCHAR(50) = 'GGG_FFFF_AAAA_BBBBBB_CCC_DDDDD' 

SELECT 
Reverse(LEFT(Stuff(Reverse(@STR), 1, Charindex('_', Reverse(@STR)) + 1 - 1, ''), Charindex('_', Stuff(Reverse(@STR), 1, Charindex('_', Reverse(@STR)) + 1 - 1, '')) - 1)) as FIRST_COL, 
Reverse(LEFT(Reverse(@STR), Charindex('_', Reverse(@STR)) - 1)) as SECOND_COL 

有没有更简单的实现这个

+0

可能的重复[如何将逗号分隔值拆分为列](http://stackoverflow.com/questions/10581772/how-to-split-a-comma-separated-value-to-columns ) –

回答

5

您可以使用XML:

DECLARE @input nvarchar(max) = 'GGG_FFFF_AAAA_BBBBBB_CCC_DDDDD', 
     @x xml 

SELECT @x = CAST('<a>'+REPLACE(REVERSE(@input),'_','</a><a>')+'</a>' as xml) 


SELECT REVERSE(@x.value('/a[2]','nvarchar(max)')) as FIRST_COL, 
     REVERSE(@x.value('/a[1]','nvarchar(max)')) as SECOND_COL 

输出:

FIRST_COL SECOND_COL 
CCC   DDDDD 
3

可以使用PARSENAME(与2012年开始)

DECLARE @Val NVARCHAR(100)= 'AAAA_BBB_CCC_DDDDD' 
SELECT PARSENAME(REPLACE(@Val, '_', '.'), 1) -- DDDDD 
SELECT PARSENAME(REPLACE(@Val, '_', '.'), 2) -- CCC 

注意:这是不超过3 _

+0

长度不固定它可以超过4'_' –

+0

你的回答比其他人好一些 –

+0

@SandipPatel - 当你有3个以上的'_'时问题不会奏效 –

2
Declare @Var1 VARCHAR(MAX)='AAAA_BBB_CCC_DDDDDDD' 

----SELECT CHARINDEX('_',REVERSE(@Var1)) 
SELECT RIGHT(@Var1,CHARINDEX('_',REVERSE(@Var1))-1) 


-----SELECT REPLACE(@Var1,RIGHT(@Var1,CHARINDEX('_',REVERSE(@Var1))),'') 

--SELECT CHARINDEX('_',REVERSE(
-- REPLACE(@Var1,RIGHT(@Var1,CHARINDEX('_',REVERSE(@Var1))),'') 
--)) 

SELECT RIGHT(
REPLACE(@Var1,RIGHT(@Var1,CHARINDEX('_',REVERSE(@Var1))),''), 
CHARINDEX('_',REVERSE(
    REPLACE(@Var1,RIGHT(@Var1,CHARINDEX('_',REVERSE(@Var1))),'') 
))-1) 
正确
1

您可以使用用户定义的自定义功能如下

DECLARE @Val NVARCHAR(100)= 'AAAA_BBB_CCC_DDDDD' 
;with cte as (
    select id, val, MAX(id) over (partition by 1) maximum 
    from dbo.SQLSplitString(@Val,'_',1,0) t 
) 
select val from cte where id >= maximum - 1 

您可以找到SQL split function codes这里

1

试试这个:在存储串,存储它作为反转,减少了UN-neccessary调用使字符串反向

DECLARE @STR VARCHAR(50) =REVERSE('GGG_FFFF_AAAA_BBBBBB_CCC_DDDDD') 

SELECT REVERSE(SUBSTRING(@STR,0, CHARINDEX('_',@STR))), 
     REVERSE(SUBSTRING(@STR,CHARINDEX('_',@STR,CHARINDEX('_',@STR))+1,3)) 
+1

你需要扭转结果然后 –

相关问题