powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Парсим строку, разделитель #
8 сообщений из 8, страница 1 из 1
Парсим строку, разделитель #
    #39283698
Landgraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую всех!

Есть достаточно тривиальная задача: дана строка, содержащая в себе N-ое количество полей. В качестве разделителя полей используется знак решетка - #. Необходимо распарсить строку - вычленить поля.

Пример строки: AAA#BBB#CCC#DDD

Набросал такой запрос:
Код: plsql
1.
2.
3.
4.
5.
      select  RegExp_substr(Stroka,'[^#]+',1,level) as Result
           from 
                (select ('AAA#BBB#CCC#DDD') as Stroka from dual)
           connect by 
              RegExp_substr(Stroka,'[^#]+',1,level) is not null


Результат:
ResultAAABBBCCCDDD

Но, если одно из полей будет пустое, то текущий запрос его не увидит.
Например: AAA#BBB##CCC#DDD

Получаем такой же результат:
ResultAAABBBCCCDDD

а нужно отображать и все пустые поля, вот так:
ResultAAABBB CCCDDD

Решил задачу путем вставки пробела между двумя решетками:
Код: plsql
1.
2.
3.
4.
5.
      select  RegExp_substr(Stroka,'[^#]+',1,level) as Result
           from 
                (select Replace('AAA#BBB##CCC#DDD','##','# #') as Stroka from dual)
           connect by 
              RegExp_substr(Stroka,'[^#]+',1,level) is not null   



Теперь так-же выводятся и пусты поля.

А вопрос следующий: Как можно альтернативным способом решить данную задачку?
...
Рейтинг: 0 / 0
Парсим строку, разделитель #
    #39283713
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LandgrafКак можно альтернативным способом решить данную задачку?
instr/substr
connect by level<length(str)-length(replace(str,'#'))
...
Рейтинг: 0 / 0
Парсим строку, разделитель #
    #39283795
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Landgraf,

Код: plsql
1.
2.
3.
4.
5.
select  ltrim(RegExp_substr(Stroka,'#[^#]*',1,level),'#') as Result
     from 
          (select '#'||('AAA#BBB#CCC##DDD') as Stroka from dual)
     connect by 
        RegExp_substr(Stroka,'#[^#]*',1,level) is not null;



тут ничего альтернативного
просто соломки подстелить
...
Рейтинг: 0 / 0
Парсим строку, разделитель #
    #39283796
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Landgraf,

Начальную строку можно преобразовать так, чтоб её переварила xmltable.
Код: plaintext
1.
2.
3.
select nullif(result,' ') result
  from (select replace(regexp_replace(replace(str, '##', '# #'), '([^#]+)', '"\1"'), '#', ',') str
          from (select 'AAA#BBB##CCC#DDD' str from dual)) t,
       xmltable(t.str columns result varchar2(30) path '.') x
...
Рейтинг: 0 / 0
Парсим строку, разделитель #
    #39283977
turyanitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно с помощью функции сделать.
Примерно вот так:
Код: plsql
1.
create or replace type name_list is table of varchar2(100);


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 create or replace function comma_to_table (p_list in varchar2, p_split varchar2 default ',')
  return name_list
  pipelined
as
  l_string        varchar2 (32767) := replace (p_list, chr (10), '') || p_split;
  l_comma_index   pls_integer;
  l_index         pls_integer := 1;
begin
  loop
    l_comma_index := instr (l_string, p_split, l_index);

    exit when l_comma_index = 0;

    pipe row (trim (substr (l_string, l_index, l_comma_index - l_index)));

    l_index := l_comma_index + 1;
  end loop;
end comma_to_table; 




select * from table(comma_to_table('AAA#BBB##CCC#DDD', '#'))
...
Рейтинг: 0 / 0
Парсим строку, разделитель #
    #39284090
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Landgraf,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select  RegExp_substr(Stroka,'([^#]*?)(#|$)',1,level,null,1) as Result
           from 
                (select 'AAA#BBB##CCC#DDD' as Stroka from dual)
           connect by 
              level <= RegExp_count(Stroka,'#') + 1
/

RESULT
--------
AAA
BBB

CCC
DDD

SQL> 



SY.
...
Рейтинг: 0 / 0
Парсим строку, разделитель #
    #39284162
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

автор
Код: plsql
1.
2.
3.
4.
5.
6.
select  RegExp_substr(Stroka,'([^#]*?)(#|$)',1,level,null,1) as Result
           from 
                (select '#' as Stroka from dual)
           connect by 
              level <= RegExp_count(Stroka,'#') + 1
/
...
Рейтинг: 0 / 0
Парсим строку, разделитель #
    #39284193
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orawish,

А что не так? Строка '#' означает двe NULL подстроки разделенных #:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SQL> select  rownum,RegExp_substr(Stroka,'([^#]*?)(#|$)',1,level,null,1) as Result
  2             from
  3                  (select '#' as Stroka from dual)
  4             connect by
  5                level <= RegExp_count(Stroka,'#') + 1
  6  /

    ROWNUM RESULT
---------- ------
         1
         2

SQL>  



SY.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Парсим строку, разделитель #
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]