как извлечь строку между 2 строками - PullRequest
0 голосов
/ 14 мая 2019

нужна помощь в извлечении строки из поля CLOB (поле с именем 'note')

Я хочу извлечь все, что находится между "Причины добавлены" и "Причины удалены" в строке, показанной ниже.из-за того, что сделать это немного сложнее, иногда устраненная причина не появляется, поэтому мне нужно получить все от причины до конца.Кроме того, я не хочу брать строки в скобках "()".До сих пор мне удалось извлечь только часть из желаемой строки.

Значение CLOB:

"Change step forward
Note added
Step changed from [OFF] to [ON]
Reasons added: test1 (Type), some test 2 (Type), test3 , sometest4& and5(Type)
Reasons removed: test6- test7(Type)"


TO_CHAR(TRIM(
    regexp_substr(
    (case when note like '%Reasons removed:%' then regexp_substr(note, 'Reasons added:\s(.*?)\sReasons removed:.*', 1, 1, NULL, 1) 
    else (case when note like '%Reasons added:%' then REGEXP_SUBSTR(note,'[^:]+$') end) end),'[^(]+'))) "CODE"

test1 , some test 2, test3 , sometest4& and5

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

Один вариант будет использовать функцию regexp_substr(), как показано ниже

with tab(str) as
(
 select 'Change step forward
         Note added
         Step changed from [OFF] to [ON]
         Reasons added: test1 (Type), some test 2 (Type), test3 , sometest4& and5(Type)
         Reasons removed: test6- test7(Type)' from dual        
)
select regexp_substr(str,'Reasons added:\s(.*?)\s.*\sReasons removed',1,1,null,1)
    as "Result String"
  from tab;

Result String
---------------------------------------------------------------
test1 (Type), some test 2 (Type), test3 , sometest4& and5(Type)

Демо

0 голосов
/ 14 мая 2019

Как насчет этого? Я добавил еще одно значение в таблицу, которое не содержит строку «Причины удалены».

По сути, он выбирает все между «Причины добавлены» и «Причины удалены», если он существует; если нет, берет все от «Причины добавлено» до конца. CASE позаботится об этом.

SQL> select * from test;

COL
----------------------------------------------------------------------------------------------
"Change step forward
Note added
Step changed from [OFF] to [ON]
Reasons added: test1 (Type), some test 2 (Type), test3 , sometest4& and5(Type)
Reasons removed: test6- test7(Type)"

"This is text without "Reas. remov."
Note added
Step changed from [OFF] to [ON]
Reasons added: test1 (Type), some test 2 (Type), test3 , and this would be the end"


SQL> select trim(substr(col,
  2                instr(col, 'Reasons added') + 14,
  3                --
  4                case when instr(col, 'Reasons removed') > 0 then
  5                  instr(col, 'Reasons removed') - instr(col, 'Reasons added') - 14
  6                else
  7                  length(col)
  8                end)) result
  9  from test;

RESULT
--------------------------------------------------------------------------------
test1 (Type), some test 2 (Type), test3 , sometest4& and5(Type)
test1 (Type), some test 2 (Type), test3 , and this would be the end"

SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...