Sql для выбора и извлечения 10 символов до и 10 символов после подстроки в Oracle Clob

Рассмотрим текстовый пример ниже:

Lorem Ipsum - это просто фиктивный текст полиграфической и наборной индустрии. Lorem Ipsum был стандартным фиктивным текстом в отрасли с 1500-х годов, когда неизвестный типограф взял камбуз шрифта и скремблировал его, чтобы сделать книгу образцов шрифта. Он пережил не только пять веков, но и скачок в электронный набор, оставшись практически неизменным. Он был популяризирован в 1960-х годах с выпуском листов Letraset, содержащих отрывки Lorem Ipsum, а в последнее время - с помощью настольных издательских программ, таких как Aldus PageMaker, включая версии Lorem Ipsum.

Как мне извлечь 10 символов до и 10 символов после подстроки, скажем «Lorem Ipsum» из вышеприведенного абзаца в Oracle? Тип данных - clob. Я пробовал использовать такие функции Oracle, как SUBSTR, но пока безуспешно. Спасибо всем за помощь.


person user3376592    schedule 26.06.2017    source источник
comment
Значит, вы хотите, чтобы на выходе было industry. Lorem Ipsum has been ?   -  person Gurwinder Singh    schedule 26.06.2017
comment
Вам нужно, чтобы он работал с каждым вхождением вашей данной строки или только с первым или n-м вхождением? что произойдет, если в вхождении вашей данной строки нет предыдущих / завершающих символов?   -  person Jair Hernandez    schedule 26.06.2017
comment
Каков желаемый результат - два новых столбца (в выводе), в одном показаны десять символов до, а в другом - десять символов после? Затем: Показать NULL для десяти символов перед, если Lorem Ipsum находится в самом начале строки? Что, если от начала строки до Lorem Ipsum ровно шесть символов? Затем: Что, если Lorem Ipsum встречается в тексте более одного раза? Например: каков желаемый результат строки 'Lorem Ipsum wins. Lorem Ipsum.'?   -  person mathguy    schedule 28.06.2017


Ответы (1)


Вы можете использовать regexp_replace с обратными ссылками:

select 
    regexp_replace(col, '.*?(.{0,10}Lorem Ipsum.{0,10}).*?','\1')
from t;

Здесь . соответствует любому символу, а ? - ленивому сопоставлению. Для данного ввода он производит:

Lorem Ipsum is simplyindustry. Lorem Ipsum has been ontaining Lorem Ipsum passages,rsions of Lorem Ipsum.
person Gurwinder Singh    schedule 26.06.2017
comment
Спасибо. Думаю, я пробовал это. Но я бы хотел, чтобы результат был следующим: Lorem Ipsum - это просто промышленность. Lorem Ipsum был обработан проходами Lorem Ipsum, а не Lorem Ipsum. - person user3376592; 26.06.2017
comment
@ user3376592 - Обновил ответ. пожалуйста, попробуйте сейчас. - person Gurwinder Singh; 26.06.2017
comment
@ Gurwinder Singh Еще раз спасибо за вашу помощь. Запрос кажется правильным, но он очень медленный и возвращает все данные clob в качестве вывода вместо строки. Тип данных столбца - clob. Нужно ли нам делать что-то особенное для вывода в виде строки из clob? - person user3376592; 26.06.2017
comment
@ user3376592 - Если он находится в CLOB и запрос слишком медленный для ваших нужд, его следует переписать с использованием стандартных строковых функций, а не регулярных выражений. Это все равно будет медленным, но не таким медленным. Но сначала просмотрите вопросы, которые я задал в комментариях к вашему исходному сообщению - вам нужно предоставить более подробную информацию о самом требовании. - person mathguy; 28.06.2017
comment
@mathguy Спасибо за разъяснения. На выходе должно получиться такое Lorem Ipsum - это просто промышленность. Lorem Ipsum был обработан отрывками Lorem Ipsum, а не Lorem Ipsum. Я надеюсь, что результат имеет смысл. Мне нужно сопоставить 10 символов до и после «Lorem Ipsum». Если нет 10 символов до, но 10 символов после, то покажите 10 символов после вместе с поисковым текстом «Lorem Ipsum». Например: «Lorem Ipsum - это просто индустрия спичек». Lorem Ipsum был «соответствует» по содержанию отрывков Lorem Ipsum »является совпадением« Rsions of Lorem Ipsum ». соответствует - person user3376592; 28.06.2017