String 从列表中查找特定编号
我有数百万张这样的唱片,但我在这里分享的唱片很少 我需要的是从这个记录中取出8个字符,所以很多有(.)和一些有(/),所以删除(.)abd(/)请查看示例输出 表中的记录String 从列表中查找特定编号,string,oracle,String,Oracle,我有数百万张这样的唱片,但我在这里分享的唱片很少 我需要的是从这个记录中取出8个字符,所以很多有(.)和一些有(/),所以删除(.)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 假设您需要获得8个
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
假设您需要获得8个字符,不包括
/
和
,从字符串处开始(无论是哪种情况),并且输入字符串中正好出现一个处的(在任何情况下的组合),这应该是您需要的:
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
假设我们可以将样本视为完整且具有代表性的样本(在SO中并不总是安全的假设),则所需的输出是字符串的最后八个字符,忽略
和\
因此,最简单的方法是使用translate()
去除不需要的字符,然后返回最后八个字符:
select substr(translate(str, 'a.\', 'a'), -8) as extracted_str
from your_table
一个稍微工程化的解决方案将应用正则表达式来细化格式为999999 AA的字符串:
select regexp_replace(translate(str, 'a.\', 'a'),
'^(.*)([[:digit:]]{6}[[:alpha:]]{2})(.*)$', '\2'
) as extracted_str
from your_table
如何识别所需的字符串部分?它总是以AT开头吗?您确定每个字符串至少发生一次吗?或者它是字符串中唯一一个包含数字的部分吗?不,我不明白。您如何理解需要获取字符串的哪一部分?对于exmaply(GBR.FCL.AT.245448C.A),我需要这一部分(245448CA),问题仍然相同。如何识别所需的字符串部分?它总是以AT开头吗?您确定每个字符串至少发生一次吗?或者它是字符串中唯一包含数字的部分?如果您有一个字符串“AT.AT.AT567AT456”,该怎么办?或者如果字符串中没有AT?或者如果你在XXXXXXXX。。。