【问题标题】:SQL query to search in a sting for a specific value用于在字符串中搜索特定值的 SQL 查询
【发布时间】: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 的解决方案,所以我添加了一个新表。

标签: c# sql tags


【解决方案1】:

虽然人们已经对您的问题发表了评论并投了反对票。我同意,如果您有程序和数据库设计控制权,我建议将标签存储在单独的多对多表中。

但是,实际上有很多正当理由将串联值存储在数据库中,有时您需要吐出或搜索这些值。运行搜索拆分串联字符串到行。这是一个关于它的stackoverflow问题。 Turning a Comma Separated string into individual rows

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

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

等等。这种方法的问题是有人标记了单词“things”,而其他人标记了另一条记录“something”,并且用户搜索“thing”都会返回。

你也可以走你要走的路,做一些疯狂的substring魔术。解决问题的诀窍是创建具有 where 条件的列,以查看您实际获得的值并根据需要调整语句。如果没有数据集,我不会试图找出索引位置出了什么问题。不过我个人会把绳子剪断。

我正在写一个答案,因为我没有 50 声望来写评论....

【讨论】:

  • 感谢您的回答!我终于通过添加一个新表来做到这一点
猜你喜欢
  • 2023-03-07
  • 2021-12-02
  • 2011-06-17
  • 2018-09-15
  • 1970-01-01
  • 2011-07-21
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多