2016-04-25 13 views
0

sqlを初めて使用しました。助けてください。文字列の最後から2文字の間のsubstrへのSQL Serverクエリ

私は文字列の逆方向から数えて4番目と5番目の下線の間の値を抽出する必要

Z1234567455 
YIIUUUUUUAB 
TWJEONSOSJS 

を出力するクエリを望ん

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 

以下のようにIは、列値を持つテーブルを持っています。助けてください。 TIA。

+0

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

+0

それで、答えのどれがあなたを助けましたか? – gofr1

答えて

-1

では、このようにすることができます。

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テーブルを使用して、あなたがしなければならないすべては、数値テーブルを作成することです..あなたはまた、以下のような任意の場所で値を選択するために、ROWNUMBERを使用することができます

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) 

..

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) 

その後

;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 
のような任意の場所で番号を取得するために、CTEを使用
0

私はそのようなもののための機能が好きです。フォーマットが変更された場合は、修正する場所が1つあります。

この

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機能が搭載されています。この機能はこれを単純化します。 XMLを使用することで

0

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) 
関連する問題