Как получить определенное количество символов, которые предшествуют ключевому слову и следуют за ним?

Я использую SQL Server 2012 для запроса данных.

Один из столбцов - это текстовое поле произвольной формы, и мне нужны данные из столбца, но я не хочу возвращать весь абзац. Я хочу найти ключевое слово типа "устарел" и получить 20 символов, предшествующих ему, и 20 символов, следующих за ним.

Если бы я применил решение к следующему абзацу, где я искал слово устаревшее и 20 символов до и после него:

В 1992 году Тим Бернерс-Ли распространил документ под названием "HTML-теги", в котором было указано всего 20 тегов, многие из которых в настоящее время устарели или приняли другие формы. Первым сохранившимся тегом, который должен быть определен в документе после ключевого тега привязки, является тег абзаца. Только в 1993 году возникла дискуссия по предложенному тегу изображения.

Это вернуло бы: "Ни один из которых в настоящее время устарел или взял другой"

ПРИМЕЧАНИЕ. Я конечный пользователь, а не администратор, поэтому, пожалуйста, воздержитесь от уведомления, что мы не должны разрешать текстовое поле свободной формы, если это проблема.

3 ответа

Решение

Вы можете достичь результата с помощью этого запроса:

DECLARE @Paragraph nvarchar(max) = 'In 1992, Tim Berners-Lee circulated a document titled “HTML Tags,” which outlined just 20 tags, many of which are now obsolete or have taken other forms. The first surviving tag to be defined in the document, after the crucial anchor tag, is the paragraph tag. It wasn’t until 1993 that a discussion emerged on the proposed image tag.'
DECLARE @Keyword nvarchar(50) = 'obsolete'

SELECT SUBSTRING(@Paragraph, CHARINDEX(@Keyword, @Paragraph) - 20, LEN(@Keyword) + 40)

Вы можете попробовать это.

DECLARE @Paragraph VARCHAR(MAX) = 'In 1992, Tim Berners-Lee circulated a document titled “HTML Tags,” which outlined just 20 tags, many of which are now obsolete or have taken other forms. The first surviving tag to be defined in the document, after the crucial anchor tag, is the paragraph tag. It wasn’t until 1993 that a discussion emerged on the proposed image tag.'
DECLARE @SomeString VARCHAR(20) = 'obsolete'

SELECT SUBSTRING(@Paragraph, PATINDEX('%' + @SomeString + '%', @Paragraph) - 20, LEN(@SomeString) + 40)

Я пытался выяснить, как получить IP-адрес из строки текста. Вот как я это сделал:

CASE
    WHEN SUBSTRING(REPLACE(REPLACE(REPLACE(CS.Comment, CHAR(13), ' '), CHAR(10), ' '), CHAR(9), ' '),
        CHARINDEX('ORIGINATING IP ADDRESS', REPLACE(REPLACE(REPLACE(CS.Comment, CHAR(13), ' '), CHAR(10), ' '), CHAR(9), ' ')), 24) = 'ORIGINATING IP ADDRESS :'
        THEN
            replace(replace(replace(replace(
                RIGHT(SUBSTRING(REPLACE(REPLACE(REPLACE(CS.Comment, CHAR(13), ' '), CHAR(10), ' '), CHAR(9), ' '),
                CHARINDEX('ORIGINATING IP ADDRESS', REPLACE(REPLACE(REPLACE(CS.Comment, CHAR(13), ' '), CHAR(10), ' '), CHAR(9), ' ')), 40),15)
                    ,' ',''),'S',''),'E',''),'Y','')
    WHEN SUBSTRING(REPLACE(REPLACE(REPLACE(CS.Comment, CHAR(13), ' '), CHAR(10), ' '), CHAR(9), ' '),
        CHARINDEX('ORIGINATING IP ADDRESS', REPLACE(REPLACE(REPLACE(CS.Comment, CHAR(13), ' '), CHAR(10), ' '), CHAR(9), ' ')), 23) = 'ORIGINATING IP ADDRESS:'
        THEN
            replace(replace(replace(replace(
                RIGHT(SUBSTRING(REPLACE(REPLACE(REPLACE(CS.Comment, CHAR(13), ' '), CHAR(10), ' '), CHAR(9), ' '),
                CHARINDEX('ORIGINATING IP ADDRESS', REPLACE(REPLACE(REPLACE(CS.Comment, CHAR(13), ' '), CHAR(10), ' '), CHAR(9), ' ')), 39),15)
                    ,' ',''),'S',''),'E',''),'Y','')
    ELSE NULL
    END [IP]

Я обнаружил, что в каждом текстовом поле единственной непротиворечивой вещью является "исходящий IP-адрес", но это проявляется как "ОРИГИНАЦИОННЫЙ IP-АДРЕС:" или "ОРИГИНАЦИОННЫЙ IP-АДРЕС:", и я мог привязать свой код к этим двум строкам. Кроме того, за каждым IP-адресом следовало одно из двух слов и некоторая комбинация пробелов, поэтому, если бы в IP-адресе было менее 15 символов, в мои результаты попадала бы комбинация ' ',S,E или Y. Естественное решение состояло в том, чтобы просто заменить эти символы ни на что, чтобы это очень аккуратно обрезало мусор в конце каждого IP-адреса.

Я многому научился за последний год.:-)

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