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

Откуда:
Сообщений: 19
Приветствую,

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

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

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

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

Я примерно представляю как можно сделать разбор строки с помощью рекурсии на plsql, но хотелось бы реализовать это с помощью sql.
10 янв 18, 07:49    [21092035]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение строки на токены с помощью SQL  [new]
Elic
Member

Откуда:
Сообщений: 29980
vint44
Я примерно представляю как можно сделать разбор строки с помощью рекурсии на plsql, но хотелось бы реализовать это с помощью sql.
Тоже с помощью рекурсивного SQL или итеративной модели.
10 янв 18, 08:00    [21092044]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение строки на токены с помощью SQL  [new]
vint44
Member

Откуда:
Сообщений: 19
Да, я пытался использовать connect by, но как-то пока не получается.
Можно просто разбить на токены ориентируясь на разделители "|", но проблема в том, что разделители могут встречаться внутри токенов.
10 янв 18, 08:08    [21092060]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение строки на токены с помощью SQL  [new]
Elic
Member

Откуда:
Сообщений: 29980
vint44
Да, я пытался использовать connect by, но как-то пока не получается.
RTFM Recursive Subquery Factoring (FAQ)
10 янв 18, 08:18    [21092074]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение строки на токены с помощью SQL  [new]
-2-
Member

Откуда:
Сообщений: 15330
vint44
Я примерно представляю
with function split ... ; select column_value from table(split ...);
10 янв 18, 08:31    [21092095]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение строки на токены с помощью SQL  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54383
2|aa5|bbb3|11|123456789012|s2
рекурсией вроде несложно
10 янв 18, 08:38    [21092110]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение строки на токены с помощью SQL  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54383
+
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
10 янв 18, 08:55    [21092142]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение строки на токены с помощью SQL  [new]
Elic
Member

Откуда:
Сообщений: 29980
Elic
итеративной модели
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
10 янв 18, 09:09    [21092172]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение строки на токены с помощью SQL  [new]
vint44
Member

Откуда:
Сообщений: 19
andreymx спасибо за пример!
И всем спасибо за подсказки )
10 янв 18, 09:10    [21092179]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение строки на токены с помощью SQL  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54383
Elic
Elic
итеративной модели
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
большое спасибо за пример
найти бы время разобраться :)
10 янв 18, 09:11    [21092186]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение строки на токены с помощью SQL  [new]
vint44
Member

Откуда:
Сообщений: 19
пока писал, не увидел еще пример от Elic )
Elic, также спасибо за ваш вариант!
10 янв 18, 09:27    [21092234]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение строки на токены с помощью SQL  [new]
tttt1
Guest
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
10 янв 18, 11:53    [21092854]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение строки на токены с помощью SQL  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2788
tttt1,

21092060

.....
stax
10 янв 18, 11:55    [21092866]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить