从列表中查找特定数字

时间:2017-04-18 11:55:23

标签: string oracle

我有这样的数百万条记录,但我在这里分享的记录很少 我需要的只是从这个rec​​odrs拿8个charchers这么多有(。)和一些有(/)所以删除(。)abd(/)请看样本输出 表中的记录

.as-console-wrapper { max-height: 100%!important; top: 0; }

输出应该是这样的

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

2 个答案:

答案 0 :(得分:0)

假设你需要获得8个字符,不包括/.,从字符串AT开始(无论情况如何)并且恰好有一个AT输入字符串中的1}}(在任何情况下组合),这应该是你需要的:

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

答案 1 :(得分:0)

假设我们可以依赖于样本完整且具有代表性(在SO中并非总是安全的假设),所需的输出是字符串的最后八个字符,忽略.\

所以最简单的事情可能就是使用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