2017-05-18 3 views
0

テーブルのフィールドの最初の2つのアンダースコアの後ろと3番目のアンダースコアの前に存在する長さが異なるコードを抽出しようとしています。テーブルはこのように見えます。 30以上のコードがあり、クエリの一部としてコードを抽出する必要があります。サブストリング、Charindex

code 
==== 
XX_YYY_CODE1_ZZZ 
XX_YYY_CODE2_ZZZ 
XX_YYY_CODE3_ZZZ 
XX_YYY_CODE4_ZZZ 
... 

しかし私は、これは私にYYYではなく、私が後だと私は私がそれをやりたいし、それを再設計する方法を考え出すことができないコードを示します。このコードを使用してみました。

select 
left(SUBSTRING(code, 
CHARINDEX('_', code) + 1, len(code)), 
CHARINDEX('_',SUBSTRING(code,CHARINDEX('_', code) + 2, LEN(code)))) 
+0

、あなたの予想される出力は何ですか。? – Mansoor

+0

すべての値に3つのアンダースコアがありますか?より良いデータサンプルを提供できますか?同じ長さのため、 'substring()'はずっと簡単です。 –

+0

私が探していたものの明瞭さのわずかな欠如に対する謝罪。毎回アンダースコアが同じで、長さが異なる20〜30のコードがあります。 –

答えて

0

代わりにこの表現を試してみてください:コードの下

SELECT SUBSTRING 
(code, 
    CHARINDEX('_', code, CHARINDEX('_', code) + 1) + 1, 
    LEN(code) - 
    (CHARINDEX('_', code, CHARINDEX('_', code) + 1) + 1) - 
    CHARINDEX('_',REVERSE(code)) 
) 
+0

ありがとうございましたdotNET私はこれを少し修正して、必要なものを手に入れました。 –

+0

@MikeR:聞いてうれしい。これがあなたの質問に答えたと思うなら、将来の読者を助けるための回答としてマークしてください。 – dotNET

0

を使用し、私はそれはあなたの期待される結果を与えることを望む:

CREATE TABLE #Table(GvnString VARCHAR(100)) 

INSERT INTO #Table(GvnString) 
SELECT 'XX_YYY_Code1_ZZZ' UNION ALL 
SELECT 'XX_YYY_Code2_ZZZ' UNION ALL 
SELECT 'XX_YYY_Code3_ZZZ' UNION ALL 
SELECT 'XX_YYY_Code4_ZZZ' 

SELECT SUBSTRING(GvnString, CHARINDEX('_', GvnString, CHARINDEX('_', 
     GvnString) + 1) + 1, LEN(GvnString) - CHARINDEX('_', GvnString, 
     CHARINDEX('_', GvnString) + 1)) 
FROM #Table 
0

私は、文字列を逆にし、サブストリング操作を行っています。

CREATE TABLE #MyTable(Code VARCHAR(50)) 

INSERT INTO #MyTable(Code) 
SELECT 'XX_YYY_Code1_ZZZ' UNION ALL 
SELECT 'XX_YYY_Code2_ZZZ' UNION ALL 
SELECT 'XX_YYY_Code3_ZZZ' UNION ALL 
SELECT 'XX_YYY_Code4_ZZZ' 

select Reverse(Substring 
(substring (Reverse(code),charindex('_',Reverse(code))+1,Len(code)),0, 
CHARINDEX('_',substring (Reverse(code),charindex('_',Reverse(code))+1,Len(code))))) 
from #Table 
4

のみ、4アンダースコア場合、コード

select parsename(replace('1_2_3_4','_','.'),2) 
0

の下に使用することは、ちょうどあなたのコードを変更しました。それは動作するはずです。

select 
SUBSTRING(
substring(substring(code,CHARINDEX('_', code)+1,len(code)) 
,CHARINDEX('_', substring(code 
,CHARINDEX('_', code)+1,len(code)))+1 
,len(code)),1, 
LEN(substring(substring(code,CHARINDEX('_', code)+1,len(code)) 
,CHARINDEX('_', substring(code 
,CHARINDEX('_', code)+1,len(code)))+1 
,len(code))) 
- len(substring(substring(substring(code,CHARINDEX('_', code)+1,len(code)) 
,CHARINDEX('_', substring(code 
,CHARINDEX('_', code)+1,len(code)))+1 
,len(code)),CHARINDEX('_', substring(substring(code,CHARINDEX('_', code)+1,len(code)) 
,CHARINDEX('_', substring(code 
,CHARINDEX('_', code)+1,len(code)))+1 
,len(code)))+1, 
LEN(substring(substring(code,CHARINDEX('_', code)+1,len(code)) 
,CHARINDEX('_', substring(code 
,CHARINDEX('_', code)+1,len(code)))+1 
,len(code)))))-1) 
0

dotNETから少し修正された回答が必要でした。以下の例。

SELECT SUBSTRING 
('XX_YYY_LongCode_ZZZ', 
    CHARINDEX('_', 'XX_YYY_LongCode_ZZZ', CHARINDEX 
    ('_', 'XX_YYY_LongCode_ZZZ') + 1) + 1, 
    LEN('XX_YYY_LongCode_ZZZ') - 
    (CHARINDEX('_', 'XX_YYY_LongCode_ZZZ', CHARINDEX 
    ('_', 'XX_YYY_LongCode_ZZZ') + 1)) - 
    CHARINDEX('_',REVERSE('XX_YYY_LongCode_ZZZ')) 
) 

それとも別の例

SELECT SUBSTRING 
('XX_YYY_otherCode_ZZZ', 
    CHARINDEX('_', 'XX_YYY_otherCode_ZZZ', CHARINDEX  
    ('_', 'XX_YYY_otherCode_ZZZ') + 1) + 1, 
    LEN('XX_YYY_otherCode_ZZZ') - 
    (CHARINDEX('_', 'XX_YYY_otherCode_ZZZ', CHARINDEX 
    ('_', 'XX_YYY_otherCode_ZZZ') + 1)) - 
    CHARINDEX('_',REVERSE('XX_YYY_otherCode_ZZZ')) 
)