2017-04-18 12 views
-1

私はこのような何百万人の記録を持っているが、ここにはいくつかのレコードを共有している。 私はこのレコーダーから8人のチャーチャーを取っているだけで、 (/)リストから特定の番号を探す

GBR.FCL.AT.245448C.A 
GBR.FCL.AT.225405L.A 
at286623da 
EASA UK/AT/311969F/A 
AT/332092H/A 
AT238691G/A 

出力は、STから始まる、あなたは8つの/を除く文字、および.を取得する必要があると仮定すると、この

245448CA 
225405LA 
286623da 
311969FA 
332092HA 
+1

必要な文字列の部分をどのように認識するのですか?それはいつもATから始まるのですか? ATが文字列ごとに1回正確に出現することは確かですか?または、数字を含む文字列の唯一の部分ですか? – Aleksej

+0

いいえ....................... – Skorpion

+0

私はポイントを得ることができません。あなたは弦のどの部分を取得する必要があるのか​​、どのように理解していますか? – Aleksej

答えて

0

サンプルを完全で代表的なものにすると仮定すると(SOでは必ずしも安全な仮定ではない)、希望の出力は文字列の最後の8文字で、.\は無視されます。

だから、おそらく仕事ができる最も簡単な方法は、最後の8つの文字を返し、その後translate()を使用して、不要な文字を取り除くために次のようになります。

select substr(translate(str, 'a.\', 'a'), -8) as extracted_str 
from your_table 

少しはソリューションは、文字列を微正規表現を適用する設計フォーマットの999999AA:

select regexp_replace(translate(str, 'a.\', 'a'), 
        '^(.*)([[:digit:]]{6}[[:alpha:]]{2})(.*)$', '\2' 
    ) as extracted_str 
from your_table 
0

ようにする必要があり、表にサンプル出力に レコードを参照してください。

with input(x) as (
    select 'GBR.FCL.AT.245448C.A' from dual union all 
    select 'GBR.FCL.AT.225405L.A' from dual union all 
    select 'at286623da' from dual union all 
    select 'EASA UK/AT/311969F/A' from dual union all 
    select 'AT/332092H/A' from dual union all 
    select 'AT238691G/A' from dual 
) 
select x as yourString, 
     substr(translate(x, 'x/.', 'x'), instr(translate(upper(x), '/.x', 'x'), 'AT')+2, 8) as result 
from input 

与える:

YOURSTRING   RESULT 
-------------------- -------------------------------- 
GBR.FCL.AT.245448C.A 245448CA 
GBR.FCL.AT.225405L.A 225405LA 
at286623da   286623da 
EASA UK/AT/311969F/A 11969FA 
AT/332092H/A   332092HA 
AT238691G/A   238691GA 
入力文字列内リング ATは(どんなにケース)と(いずれのケースの組み合わせで) ATの正確に一つの発生があることを、これはあなたが必要なものでなければなりません
関連する問題