获取oracle中两个特殊字符之间的文本

时间:2015-02-17 11:19:42

标签: oracle10g

我有一个要求,我必须在两个特殊字符之间接收数据。第一个和第二个角色。

例如:KVN REG#HENDRI#AEP: 6256765058812#KERG00101258#875303069817#THT914000

这里我需要第一个#和第二个之间的数据。我收集了来自不同来源的数据并编写了一个查询。我只是想知道一个更简单的查询形式,其中我不需要放置rownum函数。

查询:

select b.name as v_custname
  from ( select a.*, rownum rnum
           from (SELECT regexp_substr(token, '[^:]+', 1, 1) name
FROM (
  SELECT regexp_substr(s, '[^\#]+', 1, lvl) token, lvl
  FROM (
    SELECT s, LEVEL lvl FROM (select 'KVN REG#HENDRI#AEP: 6256765058812#KERG00101258#875303069817#THT914000' s from dual) 
    CONNECT BY LEVEL < LENGTH(s) - LENGTH(REPLACE(s, '#'))
  )
) ) a
          where rownum <= 2 ) b
 where rnum >= 2;

1 个答案:

答案 0 :(得分:1)

您只需使用instrsubstr()

即可完成此操作
with sample_data as (
  select 'KVN REG#HENDRI#AEP: 6256765058812#KERG00101258#875303069817#THT914000' as token
  from dual
)
select substr(token, 
              instr(token, '#') + 1, 
              instr(token, '#', 1, 2) - instr(token, '#') - 1

)     来自sample_data

  • instr(token, '#') + 1找到#
  • 的第一个匹配项
  • instr(token, '#', 1, 2)发现第二次出现#
  • substr()获取第一个位置加上要提取的长度。你需要的长度是第二个位置减去第一个位置。