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

Помогите разбить строку на отдельные строки с помощью SQL.
Есть строка вида:

"2|aa5|bbb3|11|123456789012|s2"

где - цифра в начале строки до раделителя "|" указывает длину следующего за разделителем токена. В конце токена снова идут цифры до разделителя "|", указывающие длину следующего токена, и так далее

В итоге должен получиться набор строк вида:
aa
bbb3|
12345678901
s2

Я примерно представляю как можно сделать разбор строки с помощью рекурсии на plsql, но хотелось бы реализовать это с помощью sql.
...
Рейтинг: 0 / 0
Разбиение строки на токены с помощью SQL
    #39581439
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vint44Я примерно представляю как можно сделать разбор строки с помощью рекурсии на plsql, но хотелось бы реализовать это с помощью sql.Тоже с помощью рекурсивного SQL или итеративной модели.
...
Рейтинг: 0 / 0
Разбиение строки на токены с помощью SQL
    #39581442
vint44
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, я пытался использовать connect by, но как-то пока не получается.
Можно просто разбить на токены ориентируясь на разделители "|", но проблема в том, что разделители могут встречаться внутри токенов.
...
Рейтинг: 0 / 0
Разбиение строки на токены с помощью SQL
    #39581444
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vint44Да, я пытался использовать connect by, но как-то пока не получается.RTFM Recursive Subquery Factoring (FAQ)
...
Рейтинг: 0 / 0
Разбиение строки на токены с помощью SQL
    #39581447
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vint44Я примерно представляюwith function split ... ; select column_value from table(split ...);
...
Рейтинг: 0 / 0
Разбиение строки на токены с помощью SQL
    #39581454
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2|aa5|bbb3|11|123456789012|s2
рекурсией вроде несложно
...
Рейтинг: 0 / 0
Разбиение строки на токены с помощью SQL
    #39581462
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
WITH T AS
(
SELECT '2|aa5|bbb3|11|123456789012|s2'||'0|' T FROM dual
--SELECT '5|bbb3|11|123456789012|s2'||'0|' T FROM dual
),
r(n, T, l) AS
(
SELECT SUBSTR(T, INSTR(T, '|')+1, SUBSTR(T, 1, INSTR(T, '|')-1)) n, SUBSTR(T, SUBSTR(T, 1, INSTR(T, '|')-1)+1+LENGTH(SUBSTR(T, 1, INSTR(T, '|')))) T, 1 l FROM T
UNION ALL
SELECT SUBSTR(T, INSTR(T, '|')+1, SUBSTR(T, 1, INSTR(T, '|')-1)) n, SUBSTR(T, SUBSTR(T, 1, INSTR(T, '|')-1)+1+LENGTH(SUBSTR(T, 1, INSTR(T, '|')))) T, l+1 FROM r
WHERE T IS NOT NULL
)
SELECT * FROM r

...
Рейтинг: 0 / 0
Разбиение строки на токены с помощью SQL
    #39581464
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elicитеративной модели
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SQL> with t as (select 1 as id, '2|aa5|bbb3|11|123456789012|s2' as s from dual)
  2  select id, item from t
  3    model
  4      partition by (id)
  5      dimension by (0 as i)
  6      measures(s, cast(null as varchar2(20)) as item, 0 as n)
  7      rules
  8      iterate(100) until (s[0] is null)
  9      ( n[iteration_number] = regexp_substr(s[0], '^\d+')
 10      , item[iteration_number] = substr(s[0], 1 + length(n[iteration_number]) + 1, n[iteration_number])
 11      , s[0] = substr(s[0], length(n[iteration_number]) + 1 + n[iteration_number] + 1)
 12      )
 13  ;

         ID ITEM
----------- --------------------
          1 aa
          1 bbb3|
          1 12345678901
          1 s2
...
Рейтинг: 0 / 0
Разбиение строки на токены с помощью SQL
    #39581466
vint44
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymx спасибо за пример!
И всем спасибо за подсказки )
...
Рейтинг: 0 / 0
Разбиение строки на токены с помощью SQL
    #39581468
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicElicитеративной модели
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SQL> with t as (select 1 as id, '2|aa5|bbb3|11|123456789012|s2' as s from dual)
  2  select id, item from t
  3    model
  4      partition by (id)
  5      dimension by (0 as i)
  6      measures(s, cast(null as varchar2(20)) as item, 0 as n)
  7      rules
  8      iterate(100) until (s[0] is null)
  9      ( n[iteration_number] = regexp_substr(s[0], '^\d+')
 10      , item[iteration_number] = substr(s[0], 1 + length(n[iteration_number]) + 1, n[iteration_number])
 11      , s[0] = substr(s[0], length(n[iteration_number]) + 1 + n[iteration_number] + 1)
 12      )
 13  ;

         ID ITEM
----------- --------------------
          1 aa
          1 bbb3|
          1 12345678901
          1 s2

большое спасибо за пример
найти бы время разобраться :)
...
Рейтинг: 0 / 0
Разбиение строки на токены с помощью SQL
    #39581480
vint44
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пока писал, не увидел еще пример от Elic )
Elic, также спасибо за ваш вариант!
...
Рейтинг: 0 / 0
Разбиение строки на токены с помощью SQL
    #39581614
tttt1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
2.
3.
with t as (select 1 as id, '2|aa5|bbb3|11|123456789012|s2' as s from dual)
select id, r.COLUMN_VALUE.GetStringVal()
  from t, XMLTable('tokenize($s,"\|")' passing t.s as "s") r
...
Рейтинг: 0 / 0
Разбиение строки на токены с помощью SQL
    #39581617
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tttt1,

21092060

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


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