2015-02-17 2 views
0

У меня есть требование, в котором я должен принимать данные только между двумя специальными символами. Первый и второй персонажи.Получить текст между двумя специальными символами в orcale

Ex: 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

Вы можете сделать это только с 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() занимает первую позицию плюс длину, которую необходимо извлечь. Требуемая длина - это вторая позиция минус первая позиция.
+0

Отлично, работает очень хорошо. Теперь я могу легко получить данные, что было действительно полезно и намного проще, чем предыдущий запрос. Большое вам спасибо за помощь @a_horse_with_no_name –

Смежные вопросы