Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Разбиение строки на токены с помощью SQL / 13 сообщений из 13, страница 1 из 1
10.01.2018, 07:49
    #39581432
vint44
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбиение строки на токены с помощью SQL
Приветствую,

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

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

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

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

Я примерно представляю как можно сделать разбор строки с помощью рекурсии на plsql, но хотелось бы реализовать это с помощью sql.
...
Рейтинг: 0 / 0
10.01.2018, 08:00
    #39581439
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбиение строки на токены с помощью SQL
vint44Я примерно представляю как можно сделать разбор строки с помощью рекурсии на plsql, но хотелось бы реализовать это с помощью sql.Тоже с помощью рекурсивного SQL или итеративной модели.
...
Рейтинг: 0 / 0
10.01.2018, 08:08
    #39581442
vint44
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбиение строки на токены с помощью SQL
Да, я пытался использовать connect by, но как-то пока не получается.
Можно просто разбить на токены ориентируясь на разделители "|", но проблема в том, что разделители могут встречаться внутри токенов.
...
Рейтинг: 0 / 0
10.01.2018, 08:18
    #39581444
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбиение строки на токены с помощью SQL
vint44Да, я пытался использовать connect by, но как-то пока не получается.RTFM Recursive Subquery Factoring (FAQ)
...
Рейтинг: 0 / 0
10.01.2018, 08:31
    #39581447
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбиение строки на токены с помощью SQL
vint44Я примерно представляюwith function split ... ; select column_value from table(split ...);
...
Рейтинг: 0 / 0
10.01.2018, 08:38
    #39581454
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбиение строки на токены с помощью SQL
2|aa5|bbb3|11|123456789012|s2
рекурсией вроде несложно
...
Рейтинг: 0 / 0
10.01.2018, 08:55
    #39581462
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбиение строки на токены с помощью SQL
Код: 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
10.01.2018, 09:09
    #39581464
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбиение строки на токены с помощью SQL
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
10.01.2018, 09:10
    #39581466
vint44
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбиение строки на токены с помощью SQL
andreymx спасибо за пример!
И всем спасибо за подсказки )
...
Рейтинг: 0 / 0
10.01.2018, 09:11
    #39581468
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбиение строки на токены с помощью SQL
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
10.01.2018, 09:27
    #39581480
vint44
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбиение строки на токены с помощью SQL
пока писал, не увидел еще пример от Elic )
Elic, также спасибо за ваш вариант!
...
Рейтинг: 0 / 0
10.01.2018, 11:53
    #39581614
tttt1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбиение строки на токены с помощью SQL
Код: 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
10.01.2018, 11:55
    #39581617
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбиение строки на токены с помощью SQL
tttt1,

21092060

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


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