SQL - Вывести подстроку на основе шаблона поиска, убедившись, что первая / последняя строки являются полными словами - PullRequest
0 голосов
/ 03 декабря 2009

У меня есть следующий запрос, в котором я ищу в столбце типа XMLData.

Я хочу вернуть подстроку узла, которая либо начинается с критериев поиска и количества символов X, а затем заканчивается на полном слове, либо подстрокой, которая помещает критерии поиска в середину результата с количеством символов X перед и после начала / окончания нового слова.

Причина этих двух понятий заключается в том, что критерии поиска могут быть в начале узла, следовательно, число X после символов или, если глубоко в тексте, отображаются символы до / после.

Кажется, мой запрос начинается с нового слова, но я не могу разобраться, заканчивая его, у меня была попытка перевернуть строку, сделать для нее patindex, затем выполнить длительность поиска - patindex, но, похоже, это не работа.

Спасибо

SELECT 
P.Title,
SUBSTRING(DATA.value('(/PageContent/Text)[1]', 'VARCHAR(100)'),PATINDEX('%north%',DATA.value('(/PageContent/Text)[1]', 'VARCHAR(100)')) - 20 + PATINDEX('% %',SUBSTRING(DATA.value('(/PageContent/Text)[1]', 'VARCHAR(100)'),PATINDEX('%north%',DATA.value('(/PageContent/Text)[1]', 'VARCHAR(100)')) - 20,999)),999) AS Data

FROM WEBPAGECONTENT W

INNER JOIN WebPage P
ON P.ID = W.PageID

WHERE COALESCE(PATINDEX('%north%',DATA.value('(/PageContent/Text)[1]', 'VARCHAR(100)')),0) > 0

1 Ответ

0 голосов
/ 03 декабря 2009

Дайте это. Я заменил ваш XML-запрос простыми переменными, но базовый формат оператора остается прежним. Это немного медвежонок для работы, хотя. Кроме того, в зависимости от ваших данных и требований вы можете изменить поиск для одного пробела, включив в него другие символы, например «.» и ',' как потенциальные концы слов.

Как бы я ни хотел объяснить каждый фрагмент кода, он истек мой обеденный перерыв, поэтому я оставлю это в качестве упражнения для читателя;)

DECLARE
 @search_string VARCHAR(20),
 @string   VARCHAR(1000)

SET @string = 'This is a test north this is only a test'
SET @search_string = 'north'

SELECT
 SUBSTRING(@string,
 CASE
  WHEN PATINDEX('%' + @search_string + '%', @string) <= 20 THEN 1
  WHEN PATINDEX('% %', SUBSTRING(@string, PATINDEX('%' + @search_string + '%', @string) - 20, 20)) <> 0
   THEN PATINDEX('% %', SUBSTRING(@string, PATINDEX('%' + @search_string + '%', @string) - 20, 20))
  ELSE PATINDEX('%' + @search_string + '%', @string)
 END,
 CASE
  WHEN PATINDEX('%' + @search_string + '%', @string) + LEN(@search_string) >= LEN(@string) - 20 THEN 1000
  WHEN PATINDEX('% %', SUBSTRING(@string, PATINDEX('%' + @search_string + '%', @string) + LEN(@search_string), 20)) <> 0
   THEN PATINDEX('% %', SUBSTRING(@string, PATINDEX('%' + @search_string + '%', @string) + LEN(@search_string), 20))
  ELSE 0
 END + LEN(@search_string) +
 (PATINDEX('%' + @search_string + '%', @string) - CASE
  WHEN PATINDEX('%' + @search_string + '%', @string) <= 20 THEN 1
  WHEN PATINDEX('% %', SUBSTRING(@string, PATINDEX('%' + @search_string + '%', @string) - 20, 20)) <> 0
   THEN PATINDEX('% %', SUBSTRING(@string, PATINDEX('%' + @search_string + '%', @string) - 20, 20))
  ELSE PATINDEX('%' + @search_string + '%', @string)
 END)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...