powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Преобразовать строку в список
21 сообщений из 21, страница 1 из 1
Преобразовать строку в список
    #38703638
Izhivih
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Например есть
select '1,2,32,444,F,A' from dual

Хотелось бы получить так:

1
2
32
444
F
A

Есть ли такая функция в Оракл?
...
Рейтинг: 0 / 0
Преобразовать строку в список
    #38703642
ATymkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Izhivih,

pivot/unpivot
...
Рейтинг: 0 / 0
Преобразовать строку в список
    #38703644
Фотография Ryuu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
split
...
Рейтинг: 0 / 0
Преобразовать строку в список
    #38703647
Izhivih
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо все незнакомо, будем гуглить.

Если не сложно можно простой пример?
...
Рейтинг: 0 / 0
Преобразовать строку в список
    #38703648
Фотография Ryuu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подробно вот .
А так да, pivot/unpivot, но это с 11 оракла.
...
Рейтинг: 0 / 0
Преобразовать строку в список
    #38703653
Izhivih
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
11 не подходит, тут 10..
...
Рейтинг: 0 / 0
Преобразовать строку в список
    #38703683
Izhivih
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не стал мудорствовать сделал так:

with t as (
select '1,2,32,444,F,A' str,',' delimiter from dual
)
select *
from t
,table(
cast(
multiset(
select regexp_substr(t.str,'[^'||t.delimiter||',]+',1,level) -- с 10g
from dual
connect by regexp_substr(t.str,'[^'||t.delimiter||',]+',1,level) is not null -- c 10g
-- для 11g лучше будет:
-- level<=regexp_count(t.str,',')
) as sys.odcivarchar2list
)
) substring
...
Рейтинг: 0 / 0
Преобразовать строку в список
    #38703699
Азагаш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Izhivih, так не быстрее будет?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with t as ( select '1,2,32,444,F,A' str,
                   ',' delimiter from dual ),
     s as ( select delimiter||str||delimiter str,
                   delimiter delimiter from t )
select *
from ( select n.n, 
       substr(s.str, instr(s.str, s.delimiter, 1, n.n) + 1, 
                     instr(s.str, s.delimiter, 1, n.n+1) - instr(s.str, s.delimiter, 1, n.n) -1 ) r
       from s  
       cross join ( select level n from dual connect by level < ( select length(t.str) from t ) ) n )
where r is not null 
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Преобразовать строку в список
    #39333591
(o-O)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Подскажите пожалуйста как можно разбить строку текста,в которой разделителем является нумерованный список с круглой скобочкой.


Примеры строк:

Aaaa 1) bbbbb 2) ccccc 3) DDDDD

1) AAAA 2) BBBB 3) CCCC 4) DDDD
...
Рейтинг: 0 / 0
Преобразовать строку в список
    #39333616
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно regexp_replace-ом поменять '[0-9]+\)' на регулярный разделитель и разбить как обычно
Можно regexp_substr-ом выдергивать
...
Рейтинг: 0 / 0
Преобразовать строку в список
    #39334028
Самое быстрое, что удалось найти. Найдено в Апексовых схемах

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create or replace function F_SPLIT(str in clob,ch in varchar2) return TypeTestList pipelined is
v_path APEX_APPLICATION_GLOBAL.VC_ARR2;
BEGIN
    v_path := APEX_UTIL.STRING_TO_TABLE(str, ch);
     for i in v_path.first..v_path.last loop
      pipe row (TypeTestObject(v_path(i)));
    end loop;
    exception when others then
      null;
end;



Вызов:

Код: plsql
1.
SELECT VAL FROM TABLE(F_SPLIT('1,2,3,4,5,6',','))
...
Рейтинг: 0 / 0
Преобразовать строку в список
    #39334029
Ерошевич Павел,

Забыл про типы

Код: plsql
1.
2.
3.
4.
5.
6.
create or replace type TypeTestObject as object
(
 val varchar2(4000)
)

create or replace type TypeTestList as table of TypeTestObject
...
Рейтинг: 0 / 0
Преобразовать строку в список
    #39334089
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл еще сам APEX подтянуть
...
Рейтинг: 0 / 0
Преобразовать строку в список
    #39500884
ConnectOrNotConnect
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
2.
3.
4.
5.
6.
with t as (select '1,2,32,444,F,A' str,',' delimiter from dual)
select *
  fromt, table(cast(multiset(select regexp_substr(t.str,'[^'||t.delimiter||',]+',1,level) -- с 10g
                                          from dual
                                      connect by level<= regexp_count(t.str, ',')) as sys.odcivarchar2list)
) substring


Запрос этот кажется громоздким, касты, тейблы, джойн...
Берем просто
Код: plsql
1.
2.
3.
  select distinct regexp_substr(t.str, '[^,]+',1,level)
    from some_table
connect by level<= regexp_count(t.str, ',')


Но не нравится дистинкт из-за замножения по коннект бай левел, ну и вообще замножение не нравится и первый вариант с ним изящно справляется.
Но вопрос, нет возможности в самом connect by level убрать замножение там прикрутить connect by prior c nocycle какой-нибудь.
...
Рейтинг: 0 / 0
Преобразовать строку в список
    #39500895
irbis_al
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Izhivih,

Я когда-то вот так делал
Код: plsql
1.
2.
select wmsys.wm_concat(p.name)
from pack p


Ответ
Код: xml
1.
Банка,Блок,Бутылка,Гофропак,Грамм,Гривня,Килограмм,Коробка,Литр,Пак,Пачка,Полиэтилен,Стакан,Т\пак,Тетра-топ,Упаковка,Штука,Ящик
...
Рейтинг: 0 / 0
Преобразовать строку в список
    #39500896
irbis_al
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приношу извинения автору наоброт надо...
Строку в столбец а не столбец в строку.(как у меня)
...
Рейтинг: 0 / 0
Преобразовать строку в список
    #39500946
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ConnectOrNotConnectЗапрос этот кажется громоздким, касты, тейблы, джойн...Ну так напиши один раз собственный pipelined генератор, котор
Можно конечно глянуть логи stunnel, но по почерку видно, как какой-монструозный сервер приложений на их стороне на первый запрос разогревается невообразимо долго. Поскольку у них продукт купленый, сколько бы они вам не ездили по ушам, лучше он вряд ли станет, будете вы что-то замерять или нет.
ый очень просто вызвать:
Код: plsql
1.
, table(generator_func(n))
...
Рейтинг: 0 / 0
Преобразовать строку в список
    #39500953
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
irbis_alЯ когда-то вот так делал


И очень плохо делал. И если такой код у тебя в production то беги исправлять пока не перешел на 12C. WMSYS.WM_CONCAT недокументированная функция и меняла поведеие в разных версиях а в 12C вообще исчезла:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SQL> select  banner
  2    from  v$version
  3  /

BANNER
----------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE    11.2.0.3.0      Production
TNS for 64-bit Windows: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production

SQL> select  wmsys.wm_concat(dname)
  2    from  dept
  3  /

WMSYS.WM_CONCAT(DNAME)
----------------------------------------------------------------------------
ACCOUNTING,RESEARCH,SALES,OPERATIONS

SQL>



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SQL> select  banner
  2    from  v$version
  3  /

BANNER
--------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
PL/SQL Release 12.2.0.1.0 - Production
CORE    12.2.0.1.0      Production
TNS for 64-bit Windows: Version 12.2.0.1.0 - Production
NLSRTL Version 12.2.0.1.0 - Production

SQL> select  wmsys.wm_concat(dname)
  2    from  dept
  3  /
select  wmsys.wm_concat(dname)
        *
ERROR at line 1:
ORA-00904: "WMSYS"."WM_CONCAT": invalid identifier


SQL>



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

Вы знаете ну "чи не алгоритм"...ну заменю самописной функцией эту wmsys.wm_concat в Oracle 12том.
(Любой начинающий на pl/sql её аналогию сможет написать)
И автору топика посоветовал бы pipilined функцию сделать для его решения.(а не на простом классическом sqlЕ это "мучать")
...
Рейтинг: 0 / 0
Преобразовать строку в список
    #39500975
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
irbis_alну заменю самописной функцией эту wmsys.wm_concat в Oracle 12том.


Вот и я о том-же: беги исправлять.

SY.
...
Рейтинг: 0 / 0
Преобразовать строку в список
    #39501074
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ConnectOrNotConnect
Код: plsql
1.
2.
3.
4.
5.
6.
with t as (select '1,2,32,444,F,A' str,',' delimiter from dual)
select *
  fromt, table(cast(multiset(select regexp_substr(t.str,'[^'||t.delimiter||',]+',1,level) -- с 10g
                                          from dual
                                      connect by level<= regexp_count(t.str, ',')) as sys.odcivarchar2list)
) substring


Запрос этот кажется громоздким, касты, тейблы, джойн...
Берем просто
Код: plsql
1.
2.
3.
  select distinct regexp_substr(t.str, '[^,]+',1,level)
    from some_table
connect by level<= regexp_count(t.str, ',')


Но не нравится дистинкт из-за замножения по коннект бай левел, ну и вообще замножение не нравится и первый вариант с ним изящно справляется.
Но вопрос, нет возможности в самом connect by level убрать замножение там прикрутить connect by prior c nocycle какой-нибудь.

Код: 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.
SQL> select * from t;

        ID N
---------- ------------------------------
         1 1,2,3,33,aa
         2 3,5,7,ss,666

SQL> select --distinct
  2    id
  3   ,level l
  4   ,regexp_substr(t.n, '[^,]+',1,level) r
  5  from t
  6       connect by level<= regexp_count(t.n, ',')+1
  7   and rowid=prior rowid
  8   and prior sys_guid() is not null
  9  /

        ID          L R
---------- ---------- ------------------------------
         1          1 1
         1          2 2
         1          3 3
         1          4 33
         1          5 aa
         2          1 3
         2          2 5
         2          3 7
         2          4 ss
         2          5 666

10 rows selected.

SQL>



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


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