PL SQL регулярное выражение получить конкретное вхождение - PullRequest
1 голос
/ 02 мая 2019

У меня есть такая строка: aa;bb;cc

Количество символов в каждом блоке может быть разным.

; - это разделитель.

Мне нужнопринимать значения отдельно.Например: я хочу взять только вхождение во второй позиции (bb).

Я пробовал это:

SELECT trim(regexp_substr('aa;bb;cc', '[^;]+', 1, LEVEL)) str
   FROM dual 
CONNECT BY regexp_substr('aa;bb;cc', '[^;]+', 1, LEVEL) IS NOT NULL;

Но если я сделаю:

SELECT * FROM (SELECT trim(regexp_substr('aa;bb;cc', '[^;]+', 1, LEVEL)) str
   FROM dual 
CONNECT BY regexp_substr('aa;bb;cc', '[^;]+', 1, LEVEL) IS NOT NULL) 
  WHERE ROWNUM = 2; 

Не работает.

Ответы [ 3 ]

1 голос
/ 02 мая 2019

Почему бы тебе просто не написать это?

 select trim(regexp_substr('aa;bb;cc', '[^;]+', 1, 2)) str from dual 

Если вы хотите использовать рекурсивный запрос, используйте rownum с псевдонимом во внутреннем запросе или используйте level псевдостолбец:

select str 
  from (
    select level lvl, trim(regexp_substr('aa;bb;cc', '[^;]+', 1, 2)) str 
      from dual 
      connect by regexp_substr('aa;bb;cc', '[^;]+', 1, level) is not null)
  where lvl = 2
1 голос
/ 02 мая 2019

WHERE ROWNUM = 2 никогда не вернет никакого результата, так как значение rownum вычисляется из набора результатов запроса.Но поскольку первой строки никогда не бывает, ROWNUM = 2 никогда не будет достигнут.

Вместо этого проще всего использовать OFFSET и LIMIT: SELECT * FROM ( SELECT trim(regexp_substr('aa;bb;cc', '[^;]+', 1, LEVEL)) str FROM dual CONNECT BY regexp_substr('aa;bb;cc', '[^;]+', 1, LEVEL) IS NOT NULL ) OFFSET 1 ROW FETCH NEXT 1 ROWS ONLY

1 голос
/ 02 мая 2019

Вы можете использовать

with t(str) as
(
 select 'aa;bb;cc' from dual
), t2 as
(
select trim(regexp_substr(str, '[^;]+', 1, level)) str,
       level as lvl
   from t 
 connect by regexp_substr(str, '[^;]+', 1, level) is not null
) 
select str 
  from t2
 where lvl = 2;

STR
---
bb

Демо

Я не советую вам использовать rownum столько, скольковозможно, особенно запросы с подзапросами и порядок по предложениям.В вашем случае WHERE ROWNUM = 1 возвращает значение (и результат не заслуживает доверия, я имею в виду, что для реальных значений, полученных из таблиц, может отличаться от того, что вы хотите, но для других равенств ROWNUM = 2 или ROWNUM = 3 даже не возвращать значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...