【发布时间】:2016-06-14 16:51:28
【问题描述】:
我制作了一个 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))
如果您的回答包含解释,我将不胜感激。谢谢!
【问题讨论】:
-
这就是为什么你永远不应该存储逗号分隔值。对于您的情况,您可以使用
LIKE运算符或在 C# 代码中进行解析。 -
为什么不创建一个带有标签的单独表,然后创建一个多对多表以将它们链接到现有表?在 DB 中使用逗号分隔值通常是一种糟糕的设计。
-
谢谢你们!我使用了@juharr 的解决方案,所以我添加了一个新表。