powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / рекурсия из текстового значения
8 сообщений из 8, страница 1 из 1
рекурсия из текстового значения
    #39527267
fedoamx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Была задачка, решенная на MS. Теперь не знаю как этот хитрый CTE переложить на CONNECT BY PRIOR
рекурсия из текстового значения

Если лень, открывать, то ее описание:
Существует иерархия:

имякодdata101data201.350data301.350.10data401.350.10.10data501.350.10.10.001data601.350.10.10.001.01
Очевидно, что "отцовское" подразделение разделяется путем ограничения точек.
Вопрос - как построить структуру типа:

имякодdata1data1data2data1 / data2data3data1 / data2 / data3data4data1 / data2 / data3 / data4data5data1 / data2 / data3 / data4 / data5data6data1 / data2 / data3 / data4 / data5 / data6
...
Рейтинг: 0 / 0
рекурсия из текстового значения
    #39527272
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
with mytab (n,s) as (
select 1,'01' from dual union all
select 2,'350' from dual union all
select 3,'10' from dual union all
select 4,'12' from dual union all
select 5,'001' from dual union all
select 6,'01' from dual
)
select substr(SYS_CONNECT_BY_PATH(s, '.'),2) as P from mytab
start with n=1
connect by n = level-1
;
P
--------------------------------------------------------------------------------
01
01.01
01.01.350
01.01.350.10
01.01.350.10.12
01.01.350.10.12.001
01.01.350.10.12.001.01
...
Рейтинг: 0 / 0
рекурсия из текстового значения
    #39527273
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fedoamx,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
with mytab (n,s) as (
select 1,'01' from dual union all
select 2,'350' from dual union all
select 3,'10' from dual union all
select 4,'12' from dual union all
select 5,'001' from dual union all
select 6,'01' from dual
)
select substr(SYS_CONNECT_BY_PATH(s, '.'),2) as P from mytab
start with n=1
connect by n = level
;
P
--------------------------------------------------------------------------------
01
01.350
01.350.10
01.350.10.12
01.350.10.12.001
01.350.10.12.001.01



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

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SQL> with t(n, c) as
  2  (select 'data1', '01' from dual
  3  union all select 'data2', '01.350' from dual
  4  union all select 'data3', '01.350.10' from dual
  5  union all select 'data4', '01.350.10.10' from dual
  6  union all select 'data5', '01.350.10.10.001' from dual
  7  union all select 'data6', '01.350.10.10.001.01' from dual)
  8  select level l, t.*, substr(sys_connect_by_path(n, ' / '), 4) path
  9    from t
 10  start with instr(c, '.') = 0
 11  connect by regexp_like(c, '^' || prior c || '\.\d+$');

         L N     C                   PATH
---------- ----- ------------------- --------------------------------------------------
         1 data1 01                  data1
         2 data2 01.350              data1 / data2
         3 data3 01.350.10           data1 / data2 / data3
         4 data4 01.350.10.10        data1 / data2 / data3 / data4
         5 data5 01.350.10.10.001    data1 / data2 / data3 / data4 / data5
         6 data6 01.350.10.10.001.01 data1 / data2 / data3 / data4 / data5 / data6

6 rows selected.



Можно заюзать обычный like вместо regexp_like, тогда может подхватиться индекс по c если он есть, но задача все равно странная.
...
Рейтинг: 0 / 0
рекурсия из текстового значения
    #39527284
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
with t as(
          select 'data1' n,'01' c from dual union all
          select 'data2','01.350' from dual union all
          select 'data3','01.350.10' from dual union all
          select 'data4','01.350.10.10' from dual union all
          select 'data5','01.350.10.10.001' from dual union all
          select 'data6','01.350.10.10.001.01' from dual
         ),
cte(
    n,
    nFull,
    c
   ) as (
          select  n,
                  n nFull,
                  c
            from  t
     where c not like '%.%'
         union all
          select  t.n,
                  nFull || '/' || t.n,
                  t.c
            from  cte c,
                  t
              where t.c like c.c || '.%'
                and substr(t.c,length(c.c) + 2) not like '%.%'
        )
select  *
  from  cte
/

N     NFULL                                    C
----- ---------------------------------------- -------------------
data1 data1                                    01
data2 data1/data2                              01.350
data3 data1/data2/data3                        01.350.10
data4 data1/data2/data3/data4                  01.350.10.10
data5 data1/data2/data3/data4/data5            01.350.10.10.001
data6 data1/data2/data3/data4/data5/data6      01.350.10.10.001.01

6 rows selected.

SQL> 



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

11-ка

Код: plsql
1.
2.
ERROR:
ORA-01489: result of string concatenation is too long



cast('data1' as varchar2(xxxx))

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

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


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