2016-10-18 7 views
1

ファイル名を挿入しているステージングテーブルに列があります。次のようにファイル名の形式は:ファイル名から文字列を抽出する必要があります

T225674_<suppliercode><YYYYMMDD>-<HHMM>_**<TIMBE NUMBER>**.in 

例:

T225674_789020161010-0900_12345.in 

(Iは、上記文字列から12345を抽出する必要があり、文字列は何でもよく、どのような長さのことができる)

私は上記のファイル名から<TIMBE NUMBER>を抽出する必要があります。Oracle SQLでそれを行う方法を教えてください。

おかげ

+0

この質問はどのように広すぎるのですか? – Rene

+0

このように部分文字列を試してみてはいかがですか?http://stackoverflow.com/questions/14412898/split-string-and-take-last-element – vijaykumar

答えて

2

私はこれを行いますが、それは私の最強のポイントではありません正規表現があります確信しています。しかし、INSTRとSUBSTRの組み合わせがあなたを取得します:regexp_replace

substr(string, instr(string, '_', -1) + 1, instr(string, '.') - instr(string, '_', -1) - 1)) 
+0

最高のregexpソリューション(まだ提案されていない) 'instr'と' substr'を使うよりも遅いです。 regexpソリューションは、 'instr'と' substr'を使った単純な解決法が利用できない場合にのみ使用してください。ここでニンピク:私はまた、期間を検索するために '-1'番目の引数を使用します(例えば、サプライヤコードのような文字列に他のピリオドがある場合もあります)。 – mathguy

0

ソリューション:

SELECT regexp_replace(a,'(T225674_.*_)(.*)(\.in)' ,'\2') from (
    select 'T225674_789020161010-0900_12345.in' a from dual 
) 

最初の部分(T225674_.*_)_で終わる、T225674_から始まるものと一致しました。終了グループ(.in)まで、次に来るもののためのスペースを残す:これは、第2グループ(.*)の目的である。

regexp_replaceとすると、一致するグループのコンテンツを再生できます。ここでは、グループn°2の内容のみを\2で印刷します。

1

@Reneは完全に答えていますが、ここではRegex_substrソリューションがあります。

この変更されたバージョンのanswer

select 
      regexp_substr('T225674_789020161010-0900_12345.in', '(.*?_){2}(.*?)\.', 1, 1, '', 2) 
    from dual 

(.*?_){2} - 第二アンダー後何

(.*?)\.' - 一層完全について小数点

+0

説明をありがとう。 – Rene

1

前に何(user3240704でウインク)、ここではるかに簡単でより効率的な正規表現溶液です。それでも、これはReneのソリューションよりも遅くなります。

OPを使用すると、検索する番号の前にアンダースコアと正確な文字列'.in'が続きます(この情報が正しくない場合、解決は失敗します)。

select regexp_substr(input_string, '_(\d+)\.in$', 1, 1, null, 1) from.... 

これは、ピリオド1つの以上の数字(\ dは+が1つまたは複数を意味し、数字を意味する)、続いてアンダースコアを検索します(エスケープ:。なぜなら、正規表現で自身が「いずれかを意味することで。文字列)の後ろに 'in'が続き、その後に文字列の終わりが続くので、検索パターンは入力文字列の最後に固定されます。

括弧内に\d+を入れることは "部分表現regexp_substr()関数第6引数1は、「一致した部分文字列の最初の部分式である部分文字列を返す」を意味します。

+0

非常に素敵なコードです。確かに答えは「完全」です;) –

関連する問題