Использование списка слов с подстановочными знаками в хранимых процессах SQL Server - PullRequest
2 голосов
/ 28 июня 2011

У меня есть список слов, которые я хочу исключить из некоторых результатов запроса.Список слов хранится в таблице базы данных в виде списка через запятую.например.плохо, ужасно, хуже( Примечание : не важно, что они разделены запятыми. Они также могут быть просто строками в таблице).

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

create table #keywords (column1 varchar(500))

insert #keywords values('bad, awful, worst')

create table #testData (column1 varchar(100))

insert #testData values('This is bad for you')
insert #testData values('This is good for you')
insert #testData values('This is awful for you')
insert #testData values('This is great for me')

SELECT * FROM #testData WHERE column1 like '%you%'

drop table #keywords

drop table #testData

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

Любая помощь приветствуется.Это будет выполняться на SQL Server 2005 и более поздних версиях.

РЕДАКТИРОВАТЬ - Моя главная проблема не в списке через запятую, а в способе использования значений, которые он содержит вместе с подстановочными знаками, для исключения определенных элементов из результатов моего запроса.

Ответы [ 2 ]

2 голосов
/ 28 июня 2011

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

Попробуйте что-то вроде:

create table #keywords (column1 varchar(500))

insert #keywords values('bad')
insert #keywords values('awful')
insert #keywords values('worst')

create table #testData (column1 varchar(100))

insert #testData values('This is bad for you')
insert #testData values('This is good for you')
insert #testData values('This is awful for you')
insert #testData values('This is great for me')

select *
from #testData t 
where column1 like '%you%'
  and not exists (
    select *
    from #keywords k
    where t.column1 like '%' + k.column1 + '%'
)

drop table #keywords

drop table #testData
1 голос
/ 28 июня 2011

Поскольку вы описали, что список ключевых слов присутствует по какой-то причине, я полагаю, вы ищете рекурсивное решение.Это моя операция:

DECLARE @keywords table (column1 VARCHAR(500)) 

INSERT @keywords VALUES('bad, awful, worst')

DECLARE @testData table (column1 VARCHAR(100)) 

INSERT @testData VALUES('This is bad for you')
INSERT @testData VALUES('This is good for you') 
INSERT @testData VALUES('This is awful for you') 
INSERT @testData VALUES('This is great for me') 

;WITH cte(column1, b, e, keyword) 
AS ( 
SELECT replace(column1, ' ', '') + ',' column1, 1 b, (charindex(',', column1 + ',')) e, cast('%' + substring(column1, 1, (charindex(',', column1 + ',')) - 1)+'%' as VARCHAR(50)) keyword
FROM @keywords
UNION ALL 
SELECT column1, e + 2,charindex(',', column1, e + 1), cast('%' + substring(column1, e + 1, charindex(',', column1, e + 1) - e - 1)+'%' as VARCHAR(50))
FROM cte ch
WHERE charindex(',', column1, e + 1) > 0
) 
SELECT *
FROM @testdata t
WHERE not exists (SELECT 1 FROM cte WHERE t.column1 like keyword)
and column1 like '%you%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...