2016-04-25 106 views
0

我是新來的sql。請幫忙。SQL Server查詢到substr從字符串末尾開始的2個字符

我與列值的表如下

XYZ_3244H_V65_C005_Z1234567455_P_F_20160127_0137.txt 
ERTL_3244H_V65_C005_YIIUUUUUUAB_1P_W_20160316_1227.txt 
WTERN_3244H_VTWT05_TWJEONSOSJS_QWT_N_20160316_0937.txt 

我想查詢其輸出

Z1234567455 
YIIUUUUUUAB 
TWJEONSOSJS 

我需要提取從字符串的反向計數第四和第五下劃線之間的值。請幫忙。 TIA。

+0

可能重複http://stackoverflow.com/questions/2647/how-do-i-split-a-string -so-i-can-access-item-x –

+0

那麼,有沒有任何答案對你有幫助? – gofr1

回答

-1

在MySQL中,你可以這樣做。

select substring_index(substring_index(val, '_', -5),'_',1) from 
(select 'XYZ_3244H_V65_C005_Z1234567455_P_F_20160127_0137.txt' val) t 
+3

MySql <> SQL Server – Gregg

+0

@Gregg - 我知道。我想發佈我知道的東西。我的系統上沒有安裝MS SQL。否則,我會。 :) – MontyPython

+0

這就是爲什麼我用粗體標記它。 – MontyPython

0

使用numbers表,你可以做到這一點,你所要做的就是創建一個數字表..

declare @string varchar(max) 

set @string='_'+'XYZ_3244H_V65_C005_Z1234567455_P_F_20160127_0137.txt'+'_' 


select 
substring (@string,n+1,charindex('_',@string,n+1)-n-1) 
from numbers 
where 
substring(@string,n,1)='_' 
and n<len(@string) 

你也可以使用ROWNUMBER像下面的任何地方選擇值..

select 
substring (@string,n+1,charindex('_',@string,n+1)-n-1),row_number() over (order by charindex('_',@string,n+1)) as rn 
from numbers 
where 
substring(@string,n,1)='_' 
and n<len(@string) 

然後用一個CTE來獲得一些在任何地方像

;with cte 
as 
(
select 
substring (@string,n+1,charindex('_',@string,n+1)-n-1) as splitstrig,row_number() over (order by charindex('_',@string,n+1)) as rn 
from numbers 
where 
substring(@string,n,1)='_' 
and n<len(@string) 
) 
select * from cte where rn=5 
0

我喜歡這樣的功能。如果格式發生變化,您有一個地方可以修復它。

試試這個

CREATE FUNCTION [dbo].[extract_part](@VAL varchar(max))  
returns varchar(16) 
as  
begin  
    declare 
     @idx int, 
     @split varchar(64), 
     @result varchar(16), 
     @count int; 
    declare 
     @tbl TABLE (id int identity(1,1), col varchar(64)); 

    select @idx = 1  
     if len(@VAL)<1 or @VAL is null return null;  

    while @idx!= 0  
    begin  
     set @idx = charindex('_',@VAL)  
     if @idx!=0  
      set @split= left(@VAL,@idx - 1)  
     else  
      set @split= @VAL 

     if(len(@split)>0) 
      insert into @tbl(col) values(@split)  

     set @VAL= right(@VAL,len(@VAL) - @idx)  
     if len(@VAL) = 0 break  
    end 

    select @count = count(1) from @tbl; 

    select @result = col from @tbl where id = @count - 4; 

return @result 
end 

select [dbo].[extract_part]('XYZ_3244H_V65_C005_Z1234567455_P_F_20160127_0137.txt') 

PS。 SQL 2016配備了新的SPLIT功能,可以簡化這一點。

0

隨着使用XML:

DECLARE @xml xml 

;WITH cte AS (
SELECT REVERSE(string) as string 
FROM (VALUES 
('XYZ_3244H_V65_C005_Z1234567455_P_F_20160127_0137.txt'), 
('ERTL_3244H_V65_C005_YIIUUUUUUAB_1P_W_20160316_1227.txt'), 
('WTERN_3244H_VTWT05_TWJEONSOSJS_QWT_N_20160316_0937.txt') 
) AS t(string) 
) 

SELECT @xml =(
SELECT CAST('<b><a>' +REPLACE(string,'_','</a><a>') + '</a></b>' as xml) 
FROM cte 
FOR XML PATH ('') 
) 

SELECT REVERSE(t.v.value('a[5]','nvarchar(20)')) 
FROM @xml.nodes('/b') as t(v) 

輸出:的

-------------------- 
Z1234567455 
YIIUUUUUUAB 
TWJEONSOSJS 

(3 row(s) affected)