2013-07-31 22 views
8

私は以下のような文字列を含むカラムを持つテーブルを持っています。可変長の部分文字列

RTSPP_LZ_AEN 
RTSPP_LZ_CPS 
RTSPP_LZ_HOUSTON 
RTSPP_LZ_LCRA 
RTSPP_LZ_NORTH 
RTSPP_LZ_RAYBN 
RTSPP_LZ_SOUTH 
RTSPP_LZ_WEST 
RTSPP_BTE_CC1 
RTSPP_BTE_PUN1 
RTSPP_BTE_PUN2 

は、私は、文字列の最後まで_の第二の発生から部分文字列を取得する必要があり、あなたが見ることができるようにサブストリングが固定長ではありません。最初の部分は常に固定されているわけではありません。今のところ私はそれを達成するために次のコードを使用しています。

SELECT SUBSTRING([String],CHARINDEX('_',[String],(CHARINDEX('_',[String])+1))+1,100) 
FROM [Table] 

ご覧のとおり、私は可変長の世話をするための長さとして任意の大きな値を取っています。それを行う良い方法はありますか?

+0

いつも正確に2つのアンダースコアがありますか? –

+0

最初の部分は常にRTSPP_LZ_ですか、それとも他の値を持つことができますか? –

+0

@AaronBertrand今のところ私は2つ以上のアンダースコアを持つケースに遭遇していません。このような場合、文字列の最後までの最後のアンダースコアが将来発生する可能性があります。アンダースコアのn番目の発生を扱うことができ、より汎用的な解決策を大幅に必ずしも、彼らがRTSPP_BTE_CC1 RTSPP_BTE_PUN1 RTSPP_BTE_PUN2 – Ram

答えて

11

あなたが最後に見つけることREVERSE機能と組み合わせてCHARINDEXを使用することができますオカレンスは_で、RIGHTを使用すると、指定した文字数を文字列の最後から取得できます。

SELECT RIGHT([String],CHARINDEX('_',REVERSE([String]),0)-1) 

SQLFiddle DEMO

+0

シンプルなソリューションとデモをお寄せいただきありがとうございます – Ram

6

あなたは最後の引数としてのlen([文字列])を与える試すことができます。

SELECT SUBSTRING([String],CHARINDEX('_',[String],(CHARINDEX('_',[String])+1))+1,len([string])) FROM [Table] 
+0

ようLEN([文字列])を言及するための1つの感謝を変えることができる場合を – Ram

0

それとも、これさえ:

SELECT SUBSTRING([String],CHARINDEX('_',[String],(CHARINDEX('_',[String])+1))+1, 
      LEN([String])-CHARINDEX('_',[String])+1) 
1

あなたは以下のコードのような仕事をするために、共通テーブル式を使用することができます。これは、文字列にアンダースコアがいくつあっても、すべてのサブストリングを取得できる柔軟性を提供します。

;WITH cte AS (
    SELECT 
     0 AS row 
     ,CHARINDEX('_', [String]) pos 
     ,[String] 
    FROM [Table] 
    UNION ALL 
    SELECT 
     row + 1 
     ,CHARINDEX('_', [String], pos + 1) 
     ,[String] 
    FROM cte 
    WHERE pos > 0 
) 
SELECT 
    row 
    ,[String] 
    ,pos 
    ,SUBSTRING([String], pos + 1, LEN([String]) -pos) 
FROM cte 
WHERE pos > 0 
-- Remove line below to see all possible substrs 
    AND row = 1 
ORDER BY 
    [String], pos 
+0

+1答えがありがとうございます。アンダースコアがゼロの場合でも処理しますが、CTEを使用することはできません。これははるかに大きなクエリの一部です – Ram

関連する問題