我制作了一个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))
如果您的回答包含解释,我将不胜感激。谢谢!
答案 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个只是写评论的声誉....