Разбиение строки

splitstrings
Дата: 22.09.2015 12:44:51
Здравствуйте
имеется такой запрос
with input as
(
  select 'a in (1..5)' as q from dual union all
  select 'a in (3..4) or a in (10..20)' from dual union all
  select 'a in (6..9) or a in (15..18)' from dual union all
  select 'a in (7..8) or a in (10..20) or a in (21..100)' from dual union all
  select 'a in (50..60)' from dual
)

select
  regexp_substr(i.q, '[0-9]{1,3}') as a_1,
  rtrim(regexp_substr(i.q, '[0-9]{1,3}\)'), ')') as a_2
from
   input i
union all
select
  regexp_substr(i.q, '[0-9]{1,3}', instr(i.q, 'or')),
  rtrim(regexp_substr(i.q, '[0-9]{1,3}\)', instr(i.q, 'or')), ')')
from
   input i
where
  instr(i.q, 'or') > 0
union all
select
  regexp_substr(i.q, '[0-9]{1,3}', instr(i.q, 'or', instr(i.q, 'or')+1)),
  rtrim(regexp_substr(i.q, '[0-9]{1,3}\)', instr(i.q, 'or', instr(i.q, 'or')+1)), ')')
from
   input i
where
  instr(i.q, 'or', instr(i.q, 'or')+1) > 0
  and instr(i.q, 'or') > 0

Можно ли его как-то упростить в один select?
Нужно из строки вида 'a in (6..9) or a in (15..18)' получить таблицу из двух строк
a_1a_2
69
1518
ArtNick
Дата: 22.09.2015 13:03:01
splitstrings,

Наводка:
select * from xmltable('-2 to 2, 3 to 6')
Elic
Дата: 22.09.2015 13:16:22
ArtNick
Наводка:
Перечитай требования ещё раз.
ArtNick
Дата: 22.09.2015 13:18:32
Elic,
Я предполагаю что из а1, а2 он захочет интервал
ArtNick
Дата: 22.09.2015 13:19:56
Elic,
и если предположение верно то :
with input as
(
  select 'a in (1..5)' as q from dual union all
  select 'a in (3..4) or a in (10..20)' from dual union all
  select 'a in (6..9) or a in (15..18)' from dual union all
  select 'a in (7..8) or a in (10..20) or a in (21..100)' from dual union all
  select 'a in (50..60)' from dual
)
select * 
 from input,
      xmltable(replace(replace(translate (q,'ain()',' '),'..',' to '),'or',','))  
splitstrings
Дата: 22.09.2015 13:33:51
ArtNick,

Это не то. Мне нужна такая же таблица, как у меня в условии, тут вся проблема в общем-то в том, что элементов вида a in (a_1..a_2) в одной строке может быть несколько десятков и писать десяток union all совсем не хочется. А хотелось бы как-то покрасивее, но не уверен, что это вообще возможно.
-2-
Дата: 22.09.2015 13:52:17
splitstrings
из строки вида 'a in (6..9) or a in (15..18)'
странная затея, использовать sql в качестве парсера для неsql.
ArtNick
Дата: 22.09.2015 13:54:34
splitstrings,
ни одного union all
with input as
(
  select 'a in (1..5)' as q from dual union all
  select 'a in (3..4) or a in (10..20)' from dual union all
  select 'a in (6..9) or a in (15..18)' from dual union all
  select 'a in (7..8) or a in (10..20) or a in (21..100)' from dual union all
  select 'a in (50..60)' from dual
)
select a.* 
 from input,
      xmltable(replace(translate (q,'()ain','""'),'or',','))  a

1..5
3..4
10..20
6..9
15..18
7..8
10..20
21..100
50..60

осталось 2 substra добавить
splitstrings
Дата: 22.09.2015 14:22:05
-2-,

Что поделать, надо однократно перенести подобные данные в другую таблицу и писать ради этого программу совершенно не хочется.

ArtNick,
Спасибо, то, что нужно. Заодно осенило, что instr тут вообще не нужен.
with input as
(
  select 'a in (1..5)' as q from dual union all
  select 'a in (3..4) or a in (10..20)' from dual union all
  select 'a in (6..9) or a in (15..18)' from dual union all
  select 'a in (7..8) or a in (10..20) or a in (21..100)' from dual union all
  select 'a in (50..60)' from dual
),
xmlt as (
select a.column_value as q
 from input,
      xmltable(replace(translate (q,'()ain','""'),'or',','))  a
)
select
  regexp_substr(i.q, '[0-9]{1,3}', 1, 1) as a_1,
  regexp_substr(i.q, '[0-9]{1,3}', 1, 2) as a_2
from
  xmlt i
order by 1