Oracle regexp - значение раздела в столбцах и строках

БД Oracle У меня есть значение в одной ячейке - пример:

 ID     TEXT
  1      textText text №1-2-3 texttext, text,text №1 - 1000
         textText text №1-2-3 texttext, text,text №2 - 1030

  2      textText text №1-2-3 texttext, text,text №3 - 1031
         textText text №1-2-3 texttext, text,text №4 - 1032
         textText text №1-2-3 texttext, text,text №5 - 1033

Нужно выбрать как:

 ID     TEXT                                            NUM
  1     textText text №1-2-3 texttext, text,text №1     1000
  1     textText text №1-2-3 texttext, text,text №2     1030
  2     textText text №1-2-3 texttext, text,text №3     1031
  2     textText text №1-2-3 texttext, text,text №4     1032
  2     textText text №1-2-3 texttext, text,text №5     1033

Попробуйте regexp_substr, но я мог бы разделить TEXT и NUM и NUM как новую запись. Мне нужен раздел TEXT и NUM и перейти к новой записи.

Моя попытка была такой:

 select regexp_substr(str, '^[^—]+', 1, level) TEXT,
        regexp_substr(str, '[0-9]+$', 1, level) NUM
 from   (select 'textText text №1-2-3 texttext, text,text №1 — 1000
                 textText text №1-2-3 texttext, text,text №2 — 1030'
         str from dual)
 CONNECT BY regexp_substr(str, '^[^—]+', 1, level) is not null;

И результат только одна строка, а не 2 и ЧИСЛО - последнее значение, а не текущее

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
120
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
with tab(id,txt) as(
 select 1 as id , 'textText text №1-2-3 texttext, text,text №1 - 1000'||CHR(13)||CHR(10)||
                  'textText text №1-2-3 texttext, text,text №2 - 1030' as txt from dual union all
 select 2, 'textText text №1-2-3 texttext, text,text №3 - 1031'||CHR(13)||CHR(10)||
           'textText text №1-2-3 texttext, text,text №4 - 1032'||CHR(13)||CHR(10)||
           'textText text №1-2-3 texttext, text,text №5 - 1033' as txt from dual        


)
select t.*
      ,substr(t.value,instr4(t.value,'-',-1)+2) as num
from (
    select id
         , regexp_substr(txt,'^.*$', 1, level,'m') as value
    from tab
    connect by regexp_substr(txt,'^.*$', 1, level,'m') is not null
    and prior id = id
    and prior sys_guid() is not null
) t

Результат:

1   textText text ?1-2-3 texttext, text,text ?1 - 1000     1000
1   textText text ?1-2-3 texttext, text,text ?2 - 1030     1030
2   textText text ?1-2-3 texttext, text,text ?3 - 1031     1031
2   textText text ?1-2-3 texttext, text,text ?4 - 1032     1032
2   textText text ?1-2-3 texttext, text,text ?5 - 1033     1033

Другие вопросы по теме