Регулярные выражения :)

IvaSteel
Дата: 20.12.2012 19:09:05
Ребята, помогите, с регуляркой, пожалуйста.

Есть запрос:
with tt as(
select '1234' as aaa from dual union all  --если 1 значение, то вернуть null
select '1234,12345' as aaa from dual union all --если больше 1 значения, то вернуть 2-е значение (без запятой), но не более 5 значений
select '1234,12345,12346,12347,12348,12349,12350,' as aaa from dual --если больше 1 значения, то вернуть 2-е значение (без запятой), но не более 4 значений
) 
select 
tt.*
from tt;


Т.е., в итоге надо получить:
null, 
12345
12345,12346,12347,12348
inFik
Дата: 20.12.2012 19:22:49
IvaSteel
--если больше 1 значения, то вернуть 2-е значение (без запятой), но не более 5 значений
--если больше 1 значения, то вернуть 2-е значение (без запятой), но не более 4 значений



Вы уж определитесь сколько вы хотите, здесь точность лишней не будет.
OldBoyOdeSu
Дата: 20.12.2012 20:11:23
IvaSteel,
жди ещё версий, я накидал такую(регулярки тут конечно можно сказать неиспользуются):
with tt as(
select '' as aaa from dual union all
select '1234' as aaa from dual union all
select '1234,12345,' as aaa from dual union all
select '1234,12345,12346' as aaa from dual union all
select '1234,12345,12346,12347' as aaa from dual union all
select '1234,12345,12346,12347,12348,' as aaa from dual union all
select '1234,12345,12346,12347,12348,12349,12350,' as aaa from dual
) 
select rtrim(case regexp_count(trim(',' from aaa), '[,]')
        when 0 then ''
        when 1 then substr(aaa, instr(aaa, ',')+1)
        else substr(aaa, instr(aaa, ',')+1, decode(instr(aaa, ',',1,4),0,length(aaa),instr(aaa, ',',1,4)))
      end, ',') as val
from tt;
orawish
Дата: 20.12.2012 20:23:19
IvaSteel,

11g+
with tt as(
select '1234' as a from dual union all  --если 1 значение, то вернуть null
select '1234,12345' as a from dual union all --если больше 1 значения, то вернуть 2-е значение (без запятой), но не более 5 значений
select '1234,12345,12346,12347,12348,12349,12350,' as aaa from dual --если больше 1 значения, то вернуть 2-е значение (без запятой), но не более 4 значений
) 
select 
a,regexp_substr(a,'^\d+,((\d+,){0,3}\d+)',1,1,null,1) r
from tt;
orawish
Дата: 20.12.2012 20:41:22
regexp_replace(a,'^\d+(,(\d+(,\d+){0,3}))?.*','\2') r10g
IvaSteel
Дата: 20.12.2012 20:48:51
Ребята, большое спасибо!

Работают оба вариант, но конечно, вариант orawish - прекрасен :)

P.S., сорри, забыл указать что Oracle 11.2.0.2
-2-
Дата: 20.12.2012 21:02:42
IvaSteel
прекрасен :)
прекрасен и substr(instr), если обратить на ненужность case в исполнении OldBoyOdeSu