2017-04-18 30 views
-1

我有這樣的數百萬recodrs,但我在這裏共享幾條記錄 我需要的只是從這個rec​​odrs 8個charchers這麼多有(。)和一些有(/)所以刪除(。)ABD (/),請參閱樣本輸出表 記錄從列表中查找編號

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

輸出應該是這樣的

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

如何識別您需要的字符串部分?它總是以AT開頭嗎?你確定AT每個字符串恰好出現一次嗎?或者它是包含數字的字符串的唯一部分? – Aleksej

+0

nope ....................... – Skorpion

+0

我不明白這一點。你如何理解你需要得到的字符串的哪一部分?用於exmaply的 – Aleksej

回答

0

假設我們可以依靠完整和具有代表性的樣本(SO中不總是安全的假設),則期望的輸出是字符串的最後八個字符,忽略.\

所以能夠工作將使用translate()然後返回最後8個字符去掉不需要的字符最簡單的事情:

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

假設你需要獲得8個字符,不包括/.,從ST開始環AT(不管的情況下),並且存在的AT恰好出現一次(在任何情況下組合)中輸入字符串,這應該是你所需要的:

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