Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Помогите с запросом  [new]
Разбор_строки
Guest
Добрый день, всем!
Есть
with 
  t as 
  (select 'Adddddddddddddd,Bffff,C123,D4,E,Wssss' str from dual) 
select * from t
Нужно sql запросом
str
---------------
Adddddddddddddd
Bffff
C123
D4
E
Wssss
Для любого кол-ва вхождений слова с разделителем ','
Подскажите, плиз, как лучше всего?
30 июл 09, 17:19    [7480688]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Разбор_строки,
10g+
select rtrim(regexp_substr(s,'[^,]*(,|$)', 1, level),',') words
  from (select 'Adddddddddddddd,,Bffff,C123,D4,E,Wssss'
                    s from dual)
  connect by regexp_substr(s, '[^,]*(,|$)', 1, level) is not null;
30 июл 09, 17:26    [7480761]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Разбор_строки
Guest
Спасибо за вариант, на 11g он ксати возвращает лишнюю null строку
я просто первоначально думал вот так, но мне показалось громоздко
with 
  t as 
  (select 'Adddddddddddddd,Bffff,C123,D4,E,Wssss,dd,nnn,rrr,mmnnnn,q,www,eeeeee,rt' str from dual) 
  select replace(nvl(substr(str,next+lev-1,l-next),substr(str,instr(str,',',-1)+ 1, length(str))),',','') from(
  select  str, lag(instr(substr(str, level),',', 1, level)) 
   over(order by instr(str,',', 1, level)) next,
   instr(substr(str, level),',', 1, level) l, level lev  
   from t connect by level <= regexp_count(str,',')+1) tt 
30 июл 09, 17:57    [7481041]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Разбор_строки
Guest
Извиняюсь, так и должно быть не увидел))
Там две запятые подряд
30 июл 09, 18:20    [7481204]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
stax..
Guest
Разбор_строки,

у кого-то стащил
select regexp_substr(s,'[^,]+', 1, level) piece
  from (select '1,2,33,44,555' s from dual)
  connect by regexp_substr(s, '[^,]+', 1, level) is not null


.....
stax
30 июл 09, 18:29    [7481244]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
stax..,

ну вот разница - как раз на разделителях подряд :)
select regexp_substr(s,'[^,]+', 1, level) piece
  from (select '1,2,33,,,,44,555' s from dual)
  connect by regexp_substr(s, '[^,]+', 1, level) is not null;
30 июл 09, 19:31    [7481496]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
stax..
Guest
orawish
stax..,

ну вот разница - как раз на разделителях подряд :)
select regexp_substr(s,'[^,]+', 1, level) piece
  from (select '1,2,33,,,,44,555' s from dual)
  connect by regexp_substr(s, '[^,]+', 1, level) is not null;


да я знаю
мож даж у Вас украл,
зависит от постановки (скажем если 1,,2 то ето ошибка в данных)

.....
stax
30 июл 09, 20:24    [7481623]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
aZm
Member

Откуда: 3й рим
Сообщений: 2355
еще версия. и никаких регекспов! =)

SQL> with qq as (select '11,111,111111,1,2,333' tt from dual)
  2        select substr(qq.tt,rec_from, decode(rec_to,length(qq.tt)-1,rec_to-rec_from+2,rec_to-rec_from+1))
  3        from qq,
  4            (select *
  5             from (
  6               select nr+1 rec_from, lead(nr) over (order by nr)-1 rec_to
  7               from (select decode(r,1,0,r) nr
  8                     from qq,(select rownum r
  9                              from all_objects,qq
 10                              where rownum<=length(qq.tt))
 11                              where substr(qq.tt,r,1)=',' or r=1 or r=length(qq.tt)))
 12             where rec_to is not null)
 13  /

SUBSTR(QQ.TT,REC_FROM,DECODE(R
--------------------------------------------------------------------------------
11
111
111111
1
2
333

6 rows selected

SQL> 




---
Ceterum censeo NATO esse delendam!
31 июл 09, 09:19    [7482598]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
ну а это - вариант для 11g+
with t as (select 'Adddddddddddddd,,Bffff,C123,D4,E,Wssss' s
             from dual)
    select regexp_substr(s,'([^,]*)(,|$)', 1, level,'i',1) w
      from t
connect by regexp_substr(s,'([^,]*)(,|$)', 1, level,'i') is not null;
31 июл 09, 11:03    [7483242]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
то же, чуть покороче
with t as (select 'Adddddddddddddd,,Bffff,C123,D4,E,Wssss' s
             from dual)
    select regexp_substr(s,'([^,]*)(,|$)', 1, level,'i',1) w
      from t
connect by regexp_substr(s,'([^,]*)(,|$)', 1, level) is not null;
31 июл 09, 11:06    [7483280]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить