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

Get the text between two special characters in oracle

我有一个要求,我必须只接受两个特殊字符之间的数据。第一个和第二个字符。

例如: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;

您可以只用 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()取第一个位置加上要提取的长度。你需要的长度是第二个位置减去第一个位置。