powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Что не так с regexp
15 сообщений из 15, страница 1 из 1
Что не так с regexp
    #39697418
dMazay82
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем, доброго времени суток.
Подскажите, как добить выражение, что бы на выходе было 5 записей, 2 от первого селекта и 3 от второго?
Ну и если не сложно, объясните почему получается 10 записей?
Код: sql
1.
2.
3.
4.
5.
select  regexp_substr(trim(temp), '\[Fld:(\s|\w)+\]', 1, level) 
  from (select 'Hello people [Fld: First Name] [Fld: Middle Name] это 1й шаблон12345' temp from dual
         union
         select 'Hello people [Fld: Last Name][Fld: First Name][Fld: Email Address] это 2ой шаблон"' from dual)
connect by regexp_substr(trim(temp), '\[Fld:(\s|\w)+\]', 1, level) is not null;
...
Рейтинг: 0 / 0
Что не так с regexp
    #39697421
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oracle 12c
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select sub
  from (select 'Hello people [Fld: First Name] [Fld: Middle Name] это 1й шаблон12345' temp from dual
         union
         select 'Hello people [Fld: Last Name][Fld: First Name][Fld: Email Address] это 2ой шаблон"' from dual
       ),
         lateral(select regexp_substr(temp, '\[Fld:(\s|\w)+\]', 1, level) sub
                 from dual
                 connect by regexp_substr(temp, '\[Fld:(\s|\w)+\]', 1, level) is not null
                )
         
...
Рейтинг: 0 / 0
Что не так с regexp
    #39697423
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dMazay82,

у тебя в коннект бы не хватает условия однопутности.
...
Рейтинг: 0 / 0
Что не так с regexp
    #39697424
dMazay82
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,

Надо на 10ке
...
Рейтинг: 0 / 0
Что не так с regexp
    #39697427
dMazay82
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-,

поменял на
Код: sql
1.
2.
3.
4.
5.
6.
select  regexp_substr(trim(temp), '\[Fld:(\s|\w)+\]', 1, level) 
  from (select 1 id, 'Hello people [Fld: First Name] [Fld: Middle Name] это 1й шаблон12345' temp from dual
         union
         select 2 id, 'Hello people [Fld: Last Name][Fld: First Name][Fld: Email Address] это 2ой шаблон"' from dual)
connect by regexp_substr(trim(temp), '\[Fld:(\s|\w)+\]', 1, level) is not null
and prior id =id


выскакивает
ORA-01436: цикл CONNECT BY в данных пользователя
...
Рейтинг: 0 / 0
Что не так с regexp
    #39697429
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dMazay82выскакивает
во времена десятки было суеверие проверять random на null.
...
Рейтинг: 0 / 0
Что не так с regexp
    #39697430
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и что непонятно? Ты ведь нигде не указал кто чей родитель. Mедитируй над:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
select  lpad(' ',2 * (level - 1)) || id id,regexp_substr(trim(temp), '\[Fld:(\s|\w)+\]', 1, level) x,level
  from (select 1 id,'Hello people [Fld: First Name] [Fld: Middle Name] это 1й шаблон12345' temp from dual
         union
         select 2,'Hello people [Fld: Last Name][Fld: First Name][Fld: Email Address] это 2ой шаблон"' from dual)
connect by regexp_substr(trim(temp), '\[Fld:(\s|\w)+\]', 1, level) is not null;

ID                   X                                   LEVEL
-------------------- ------------------------------ ----------
1                    [Fld: First Name]                       1
  1                  [Fld: Middle Name]                      2
    2                [Fld: Email Address]                    3
  2                  [Fld: First Name]                       2
    2                [Fld: Email Address]                    3
2                    [Fld: Last Name]                        1
  1                  [Fld: Middle Name]                      2
    2                [Fld: Email Address]                    3
  2                  [Fld: First Name]                       2
    2                [Fld: Email Address]                    3

10 rows selected.

SQL> 



Если хочешь иерархию, то:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
with t as (select 'Hello people [Fld: First Name] [Fld: Middle Name] это 1й шаблон12345' temp from dual
           union
           select 'Hello people [Fld: Last Name][Fld: First Name][Fld: Email Address] это 2ой шаблон"' from dual
          ),
     x as (
           select rownum id, temp from t
          )
select  regexp_substr(trim(temp), '\[Fld:(\s|\w)+\]', 1, level) s
  from  x
  connect by regexp_substr(trim(temp),'\[Fld:(\s|\w)+\]', 1, level) is not null
         and id = prior id
         and prior sys_guid() is not null;

S
------------------------------
[Fld: First Name]
[Fld: Middle Name]
[Fld: Last Name]
[Fld: First Name]
[Fld: Email Address]

SQL> 



SY.
...
Рейтинг: 0 / 0
Что не так с regexp
    #39697431
dMazay82
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,
Гуд, а можно немного теории, зачем надо
and prior sys_guid() is not null;?
...
Рейтинг: 0 / 0
Что не так с regexp
    #39697434
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dMazay82AmKad,

Надо на 10ке

Или через иерархию как я показал, или через MULTISET:

Код: 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.
with t as (select 'Hello people [Fld: First Name] [Fld: Middle Name] это 1й шаблон12345' temp from dual
           union
           select 'Hello people [Fld: Last Name][Fld: First Name][Fld: Email Address] это 2ой шаблон"' from dual
          )
select  regexp_substr(trim(temp),'\[Fld:(\s|\w)+\]',1,column_value) s
  from  t,
        table(
              cast(
                   multiset(
                            select  level
                              from  dual
                              connect by regexp_substr(trim(temp),'\[Fld:(\s|\w)+\]', 1, level) is not null
                           )
                   as sys.odcinumberlist
                  )
             )
/

S
--------------------
[Fld: First Name]
[Fld: Middle Name]
[Fld: Last Name]
[Fld: First Name]
[Fld: Email Address]

SQL> 



SY.
...
Рейтинг: 0 / 0
Что не так с regexp
    #39697438
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dMazay82SY,
Гуд, а можно немного теории, зачем надо
and prior sys_guid() is not null;?

CONNECT BY LOOP это когда ты пришел туда где уже был а SYS_GUID() всегда дает новое значение, что создает иллюзию типа физически там уже был а логически нет.

SY.
...
Рейтинг: 0 / 0
Что не так с regexp
    #39699174
mibin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно проще.

select regexp_substr(trim(temp), '\[Fld:(\s|\w)+\]', 1, level)
from (select 'Hello people [Fld: First Name] [Fld: Middle Name] это 1й шаблон12345' temp from dual
union
select 'Hello people [Fld: Last Name][Fld: First Name][Fld: Email Address] это 2ой шаблон"' from dual)
connect by regexp_substr(trim(temp), '\[Fld:(\s|\w)+\]', 1, level) is not null
start with rownum = 1
...
Рейтинг: 0 / 0
Что не так с regexp
    #39699187
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mibin,

авторНу и если не сложно, объясните почему так получается если в union больше 2-х записей?


.....
stax
...
Рейтинг: 0 / 0
Что не так с regexp
    #39699386
mibin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

Вся проблема в том что он начал с начала с первой записи и обработал 2е записи, потом начал со второй и опять обработал 2е записи, отсюда и задвоение, когда мы указали что необходимо начать с первой записи то у него появилось определенная строка для старта.
...
Рейтинг: 0 / 0
Что не так с regexp
    #39699424
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mibin,
попробуйте 21667234 напр на табличке (юнион) с 5-мю строками

start with rownum = 1 мало
.....
stax
...
Рейтинг: 0 / 0
Что не так с regexp
    #39699497
mibin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

Да...точно, не учёл, что level вылетает за границу, там получилось что для каждой новой строчки нужен новый Level или всё объединить сразу.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
select level,
       to_char(regexp_substr(temp, '\[Fld:(\s|\w)+\]', 1, level))  as cv_regexp
  from (
          select xmlagg(
                  xmlelement(
                    NOENTITYESCAPING
                    e,
                    temp
                  )
                 ).getclobval()
                 as temp
            from (
                    select 'Hello people [Fld: Last Name 1][Fld: First Name 1][Fld: Email Address 1] это 1 шаблон' as temp from dual
                    union
                    select 'Hello people [Fld: Last Name 2][Fld: First Name 2][Fld: Email Address 2] это 2 шаблон' as temp from dual
                    union
                    select 'Hello people [Fld: Last Name 3][Fld: First Name 3][Fld: Email Address 3] это 3 шаблон' as temp from dual
                 )
       )
connect by length(regexp_substr(temp, '\[Fld:(\s|\w)+\]', 1, level)) > 0
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Что не так с regexp
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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