2016-07-05 5 views
1

サブストリング間の境界がわかりません。たとえば、文字列063016_shape_tea_cleanse__emshptea1_の場合は、emshptea1を部分文字列にしたいが、文字列063016_shape_tea_cleanse__emshptea1_TESTDATA_HEREでも機能しなければならない。Teradataサブストリングが範囲外にある

現在、私は持っている:

sel SUBSTR('063016_shape_tea_cleanse__emshptea1_',POSITION('__' IN '063016_shape_tea_cleanse__emshptea1_')+2, 
    POSITION('_' IN SUBSTR('063016_shape_tea_cleanse__emshptea1_',POSITION('__' IN '063016_shape_tea_cleanse__emshptea1_') + 2,CHARACTER_LENGTH('063016_shape_tea_cleanse__emshptea1_') - (POSITION('__' IN '063016_shape_tea_cleanse__emshptea1_') + 2)))-1) 

しかし、それは-1にサブ27にしようとするため、それに出erroringれます。

+0

だから、 'cleanse__'の後ろにあるすべてのものを次の' _'まで使いたいですか? –

答えて

2

あなたは正規表現を使用する場合があり、これは__と、次の_または文字列の端部との間にすべてのものを抽出します:

REGEXP_SUBSTR(col, '(?<=__).+?(?=(_|$))') 

「(< =?」)は、ルックの背後にある、すなわち検索です以前の文字を結果に追加せずにここでは:__

'+'は、任意の文字、1回または複数回の検索に一致します。これは文字列の最後まで一致します( "greedy")、? '( "lazy")はそれを防ぎます。

'(?=)'は先読み、つまり後続の文字を結果に追加せずに検索します。

(|)パイプは式を複数の方法で分割します。ここでは、アンダースコア文字列または文字列の末尾のいずれか$

+0

ありがとうございました。あなたは私にすべてのシンボルが正規表現に表現されているものを説明することができますか? – Bob

+0

@BobDunakey:説明を追加しました。正規表現は非常に強力です、私は唯一の基本を知っている:) – dnoeth

関連する問題