Модификация хитрого внешнего SQL-запроса - PullRequest
0 голосов
/ 12 июня 2019

Я заинтересован в изменении внешнего запроса для расширения результатов запроса очень специфическим способом.

Мой внутренний запрос создает таблицу. Внешний запрос создает условия, которые удаляют записи из таблицы. Внешний запрос, который я хочу удалить, - это записи, в которых слово «not» содержится в том же предложении, что и фразы в обоих запросах («% postterm%», «% post__term%», «after__term%» и т. Д.). ..)

Пока что внешний запрос удаляет только записи, в которых "not" заканчивается двумя символами перед фразой.

«не» может приходить до или после этой фразы. Условие, которое мне нужно, заключается в том, включено ли «фраза» в эту фразу между периодами.

Любая помощь будет оценена! Приветствия.

SELECT sub.*
FROM(
    SELECT TOP 10000 *
    FROM MyTable N
    WHERE

  (N.[Subject] like '%postterm%')
  OR
  (N.[Content] like '%postterm%')
  ORpos
  (N.[Subject] like '%post_term%')
  OR
  (N.[Content] like '%post_term%')
  Or
  (N.[Subject] like '%post__term%')
  OR
  (N.[Content] like '%post__term%')
  OR
  (N.[Subject] like '%afterterm%')
  OR
  (N.[Content] like '%afterterm%')
  OR
  (N.[Subject] like '%after_term%')
  OR
  (N.[Content] like '%after_term%')
  Or
  (N.[Subject] like '%after__term%')
  OR
  (N.[Content] like '%after__term%')

) sub

WHERE

  (sub.[Subject] not like '%not_postterm%'

    )
      OR

  (sub.[Content] not like '%not_postterm%')
  OR
  (sub.[Subject] not like '%not_post_term%')
  OR
  (sub.[Content] not like '%not_post_term%')
  Or
  (sub.[Subject] not like '%not_post__term%')
  OR
  (sub.[Content] not like '%not_post__term%')
  OR
  (sub.[Subject] not like '%not_afterterm%')
  OR
  (sub.[Content] not like '%not_afterterm%')
  OR
  (sub.[Subject] not like '%not_after_term%')
  OR
  (sub.[Content] not like '%not_after_term%')
  Or
  (sub.[Subject] not like '%not_after__term%')
  OR
  (sub.[Content] not like '%not_after__term%')

1 Ответ

0 голосов
/ 12 июня 2019

Все это можно сделать в гораздо более умном запросе.Должен быть Sql Server 2012 или более поздней версии для функции String_Split, иначе посмотрите, как создать свою собственную функцию.

-- Set up the content
declare @T table(ID int, Content varchar(1000))
insert @t values (1, 'Hello. This is not Post Term. Another sentence')
insert @t values (2, 'Another. This is Post Term. Another sentence 2')

-- Define the search terms
declare @check table(Term varchar(100))
insert @check values ('%postterm%'),('%post_term%'),('%post__term%'),('%afterterm%'),('%after_term%'),('%after__term%')

-- This query shows you how how it works
SELECT ID, Content, SPL.value, Term, 
    case when value like '% NOT %' then 1 else 0 end as HasNot
FROM @T  AS PP
CROSS APPLY STRING_SPLIT(Content,'.') AS SPL
left join @check on SPL.Value like term

-- Final result
; with results as (
    SELECT ID, Content, SPL.value, Term, 
        case when value like '% NOT %' then 1 else 0 end as HasNot
    FROM @T  AS PP
    CROSS APPLY STRING_SPLIT(Content,'.') AS SPL
    left join @check on SPL.Value like term
)
select distinct ID,Content 
from results 
where term is not null and HasNot=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...