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

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

1
2
32
444
F
A

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

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

Если не сложно можно простой пример?
...
Рейтинг: 0 / 0
23.07.2014, 11:02
    #38703648
Ryuu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать строку в список
Подробно вот .
А так да, pivot/unpivot, но это с 11 оракла.
...
Рейтинг: 0 / 0
23.07.2014, 11:04
    #38703653
Izhivih
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать строку в список
11 не подходит, тут 10..
...
Рейтинг: 0 / 0
23.07.2014, 11:28
    #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
23.07.2014, 11:39
    #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
Период между сообщениями больше года.
25.10.2016, 14:19
    #39333591
(o-O)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать строку в список
Добрый день!
Подскажите пожалуйста как можно разбить строку текста,в которой разделителем является нумерованный список с круглой скобочкой.


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

Aaaa 1) bbbbb 2) ccccc 3) DDDDD

1) AAAA 2) BBBB 3) CCCC 4) DDDD
...
Рейтинг: 0 / 0
25.10.2016, 14:33
    #39333616
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать строку в список
Можно regexp_replace-ом поменять '[0-9]+\)' на регулярный разделитель и разбить как обычно
Можно regexp_substr-ом выдергивать
...
Рейтинг: 0 / 0
26.10.2016, 06:02
    #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
26.10.2016, 06:04
    #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
26.10.2016, 09:15
    #39334089
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать строку в список
Забыл еще сам APEX подтянуть
...
Рейтинг: 0 / 0
06.08.2017, 08:55
    #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
06.08.2017, 10:07
    #39500895
irbis_al
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать строку в список
Izhivih,

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


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

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


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

SY.
...
Рейтинг: 0 / 0
07.08.2017, 08:45
    #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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Преобразовать строку в список / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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