我有一个要求,我必须在两个特殊字符之间接收数据。第一个和第二个角色。
例如: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;
答案 0 :(得分:1)
您只需使用instr
和substr()
:
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()
获取第一个位置加上要提取的长度。你需要的长度是第二个位置减去第一个位置。