Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 апгрейд разбора строки - добавить enclosed символ  [new]
Kino36
Member

Откуда:
Сообщений: 91
Доброе утро всем. Имеется такой селект, который разбивает строку с разделителями:
select level, substr(str,instr(str, :i_delimiter, decode(level, 1, 0, 1), greatest(level - 1, 1)) + 1,
decode(connect_by_isleaf, 1, length(str), instr(str, :i_delimiter, 1, level) - 1) -
instr(str, :i_delimiter, decode(level, 1, 0, 1), greatest(level - 1, 1))
) s_str
from (select :i_parameters str from dual)
where str is not null
connect by instr(str, :i_delimiter, 1, level-1) > 0     

соответственно, из строки 1;2;3;4 он делает
1
2
3
4

Как бы к этому прикрутить поддержку enclosed, чтобы строку 1;"2;3";4 разобрать как
1
2;3
4
20 фев 14, 08:08    [15595232]     Ответить | Цитировать Сообщить модератору
 Re: апгрейд разбора строки - добавить enclosed символ  [new]
Elic
Member

Откуда:
Сообщений: 29990
SQL> select       regexp_substr(str, '[^";][^;]*|"[^"]*"', 1, level)
  2    from (select '1;"2;3";4' str from dual)
  3    connect by regexp_substr(str, '[^";][^;]*|"[^"]*"', 1, level) is not null
  4  ;

REGEXP_SU
---------
1
"2;3"
4
20 фев 14, 08:50    [15595332]     Ответить | Цитировать Сообщить модератору
 Re: апгрейд разбора строки - добавить enclosed символ  [new]
Kino36
Member

Откуда:
Сообщений: 91
Elic, спасибо большое, для меня регулярные выражения - это темный лес :)
Скажите пожалуйста, в этом случае при рекурсивном вызове получится сделать только две итерации, на первой получаем 2;3, а на второй разберем это на
2
3

А можно ли как-нибудь сделать, например, таким образом: " "2;3";"4;5" ", чтобы сначала это разобралось
"2;3";"4;5", потом
"2;3"
"4;5"
и на заключительном этапе
2
3
4
5

?
20 фев 14, 11:13    [15596190]     Ответить | Цитировать Сообщить модератору
 Re: апгрейд разбора строки - добавить enclosed символ  [new]
Elic
Member

Откуда:
Сообщений: 29990
Kino36
при рекурсивном вызове
Незачем насиловать SQL, если собираешься вызывать из PL/SQL.
Подобные алгоритмы проще и сопровождаемей реализовывать на PL/SQL.
20 фев 14, 11:30    [15596370]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить