Вы можете использовать REGEXP_SUBSTR
и группы захвата для получения подстрок до и после:
with tmp ( main_text, sub_text ) as (
SELECT 'aa bbbb cccc xx ddddd eeeeeee', 'xx' FROM DUAL
)
SELECT t.*,
REGEXP_SUBSTR(
main_text,
'((\S\s*){0,10})' || sub_text || '((\s*\S){0,10})',
1,
1,
NULL,
1
) AS before_text,
REGEXP_SUBSTR(
main_text,
'((\S\s*){0,10})' || sub_text || '((\s*\S){0,10})',
1,
1,
NULL,
3
) AS after_text
FROM tmp t;
Какие выходные данные:
MAIN_TEXT | SUB_TEXT | BEFORE_TEXT | AFTER_TEXT
:---------------------------- | :------- | :------------ | :-----------
aa bbbb cccc xx ddddd eeeeeee | xx | aa bbbb cccc | ddddd eeeee
И если вы хотите убрать пробелы, то:
with tmp ( main_text, sub_text ) as (
SELECT 'aa bbbb cccc xx ddddd eeeeeee', 'xx' FROM DUAL
)
SELECT t.*,
REGEXP_REPLACE(
REGEXP_SUBSTR(
main_text,
'((\S\s*){0,10})' || sub_text || '((\s*\S){0,10})',
1,
1,
NULL,
1
),
'\s+'
) AS before_text,
REGEXP_REPLACE(
REGEXP_SUBSTR(
main_text,
'((\S\s*){0,10})' || sub_text || '((\s*\S){0,10})',
1,
1,
NULL,
3
),
'\s+'
) AS after_text
FROM tmp t;
Какие выходные данные:
MAIN_TEXT | SUB_TEXT | BEFORE_TEXT | AFTER_TEXT
:---------------------------- | :------- | :---------- | :---------
aa bbbb cccc xx ddddd eeeeeee | xx | aabbbbcccc | dddddeeeee
дБ <> скрипка здесь