如何编写搜索商店程序(CSV)?

时间:2010-02-01 08:36:20

标签: sql-server-2005

对于给定的字符串集(CSV字符串),如何编写用于在表的列中搜索特定字符串的存储过程。

喜欢:从xxx中选择*其中的标签('oscar','rahman','slumdog')

如何为该标签组合编写程序。

2 个答案:

答案 0 :(得分:0)

首先,使用like进行精确匹配是次优的。不妨使用=,如果这样做,您可以使用IN语法:

select * from xxx 
where tags IN ('oscar', 'rahman', 'slumdog') 

我猜您不是在寻找完全匹配,而是针对tags字段包含所有标记的任何记录。

这将是这样的:

select * from xxx 
where tags like '%oscar%' 
  and tags like '%rahman%'
  and tags like '%slumdog%' 

但这不会很快或表现不佳。

考虑将这种逻辑移植到您的应用程序中,在那里它可以更快更容易地完成。

修改

在评论之后 - 有很多关于如何parse delimited strings的示例。您可以将它们放在表格中,然后使用dynamic sql生成查询。

但是,这会有不好的性能,SQL Server将无法为这种事情缓存查询计划。正如我上面所说 - 考虑将这种逻辑转移到应用程序级别。

答案 1 :(得分:0)

创建逗号分隔的字符串...

然后,您可以将此列表应用于Oded示例,以便动态创建LIKE子句的WHERE部分。

DECLARE @pos int, @curruntLocation char(20), @input varchar(2048)
SELECT @pos=0
SELECT @input = 'oscar,rahman,slumdog'
SELECT @input = @input + ','

CREATE TABLE #tempTable (temp varchar(100) )

WHILE CHARINDEX(',',@input) > 0
BEGIN
SELECT @pos=CHARINDEX(',',@input)
SELECT @curruntLocation = RTRIM(LTRIM(SUBSTRING(@input,1,@pos-1)))
INSERT INTO #tempTable (temp) VALUES (@curruntLocation)
SELECT @input=SUBSTRING(@input,@pos+1,2048)
END

SELECT * FROM #tempTable
DR0P TABLE #tempTable