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

#sql #oracle #oracle11g

#sql #Oracle #oracle11g

Вопрос:

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

  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, но я мог бы разделить ТЕКСТ и NUM и 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 и NUM — последнее значение, а не текущее

Ответ №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