在SQL Server存储过程中使用带有通配符的单词列表

时间:2011-06-28 07:58:09

标签: sql sql-server tsql

我有一个要从某些查询结果中排除的单词列表。单词列表以逗号分隔列表的形式存储在数据库表中。例如。坏,可怕,最糟糕。 (注意:它们以逗号分隔并不重要。它们可以很容易地成为表格中的行。)

我希望能够在存储过程中使用这个单词列表,以确保此列表中的关键字不会出现在我的搜索结果中的任何位置。例如,鉴于以下内容,我如何修改我的查询以确保所有搜索结果都针对我的关键字排除列表中出现的字词进行过滤?

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 个答案:

答案 0 :(得分:2)

首先,我不会将关键字存储为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 :(得分:1)

由于您之所以描述关键字wordslist是有原因的,我认为您正在寻找一种隐性解决方案。这是我的消息:

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%'