用于搜索特定值的sting的SQL查询

时间:2016-06-14 16:51:28

标签: c# sql tags

我制作了一个C#程序,用于在SQL数据库中存储问题和答案。为了更方便,我添加了一个选项来搜索名为Tags的列,该列最多包含5个用逗号分隔的单词。我尝试了以下代码,但它仅检查Tags的第一个值:

SELECT
    Id, Observations, Problem, Solution, Tags
FROM            
    IT
WHERE        
    (RTRIM(LTRIM(SUBSTRING(Tags, 1, CHARINDEX(',', Tags, 0) - 1))) IN (@a, @b, @c, @d, @e)) OR
    (RTRIM(LTRIM(SUBSTRING(Tags, CHARINDEX(',', Tags,0), CHARINDEX(',', Tags, CHARINDEX(',', Tags,0)) - 1))) IN (@a, @b, @c, @d, @e)) OR
    (RTRIM(LTRIM(SUBSTRING(Tags, CHARINDEX(',', Tags, CHARINDEX(',', Tags,0)), CHARINDEX(',', Tags, CHARINDEX(',', Tags, CHARINDEX(',', Tags,0))) - 1))) IN (@a, @b, @c, @d, @e)) OR
    (RTRIM(LTRIM(SUBSTRING(Tags, CHARINDEX(',', Tags, CHARINDEX(',', Tags, CHARINDEX(',', Tags,0))), CHARINDEX(',', Tags, CHARINDEX(',', Tags, CHARINDEX(',', Tags, CHARINDEX(',', Tags,CHARINDEX(',',Tags,0))))) - 1))) IN (@a, @b, @c, @d, @e)) OR
    (RTRIM(LTRIM(SUBSTRING(Tags, CHARINDEX(',', Tags, CHARINDEX(',', Tags, CHARINDEX(',', Tags, CHARINDEX(',', Tags,CHARINDEX(',',Tags,0))))), CHARINDEX(',', Tags, CHARINDEX(',', Tags, CHARINDEX(',', Tags, CHARINDEX(',', Tags, CHARINDEX(',', Tags,CHARINDEX(',',Tags,CHARINDEX(',',Tags,0))))))) - 1))) IN (@a, @b, @c, @d, @e))

如果您的回答包含解释,我将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

虽然人们已经评论过并且对你的问题投了反对票。我同意你是否有程序和数据库设计控制我建议将标签存储在一个单独的多对多表中。

但是,实际上存在大量有效理由在数据库中存储连接值,有时您需要吐出或搜索值。运行搜索拆分连接字符串到行。这是一个stackoverflow问题。 Turning a Comma Separated string into individual rows

如果这太麻烦@Rahul提到你可以使用LIKE,在这种情况下,你实际上会做类似的事情

 WHERE [Tags] LIKE '%' + @a + '%'
OR WHERE [Tags] LIKE '%' + @b + '%'

等。这种方法的问题是有人标记“事物”这个词而其他人标记另一个记录“某事”并且用户搜索“事物”两者都将被返回。

你也可以走你正在前进的路线并做一些疯狂的substring魔法。排除故障的诀窍是创建具有where条件的列,以查看实际获得的值,并根据需要调整语句。没有数据集,我不打算弄清楚索引位置有什么问题。我个人会把绳子砍掉。

我正在写一个答案,因为我缺少50个只是写评论的声誉....