如何根据逗号分隔值

时间:2015-07-07 07:19:51

标签: c# sql asp.net

可能是问题的标题没有正确定义我真正想问的问题。以下是我的问题的更具体描述

我的数据库中有一个下表User,其中有一列Category,其中包含多个值,但以逗号分隔

S.no.     Name         Category

 1       Ankit     Ex Soldier, Senior Citizen

 2       Ritu      Widow, Senior Citizen

 3       Akash     Ex soldier

我想根据类别

搜索记录

例如。如果我搜索

select * from User where Category='Senior Citizen'

然后它必须显示Ankit和Ritu记录。 这该怎么做。 请帮忙

4 个答案:

答案 0 :(得分:2)

试试这个:

select * from User where Category like '%Senior Citizen%'

答案 1 :(得分:1)

您需要LIKE运营商: -

select * from User where Category LIKE '%Senior Citizen%'

答案 2 :(得分:0)

select * from User where Category LIKE '%Senior Citizen%'

但是你应该为Category使用一个单独的表。

答案 3 :(得分:0)

就像KissLászló所写,你应该把信息分成两个表。这个专业术语称为“规范化”。最重要的是1NF,2NF和3NF(详细信息请参阅this)。

所以它应该如下所示:

Table Persons
PersonId    Name
1           Ankit
2           Ritu
3           Akash

Table Categories
CategoryId    Name
1             Ex. Soldier
2             Senior Citizen
3             Widow

Table PersonCategories
PersonId    CategoryId
1           1
1           2
2           2
2           3
3           3

你为什么要这样做?

在我看来,最大的原因是表现。我用你当前的方法制作了一些测试表,数据集为20k条目。查询的执行大约需要200毫秒才能返回。使用上面的模式执行以下查询约〜1ms

SELECT
  *
FROM
  Persons AS p
JOIN
  PersonCategories AS pc ON p.PersonId = pc.PersonId
JOIN
  Categories AS c on pc.CategoryId = c.CategoryId
WHERE
  c.Name = 'Senior Citizen'

为什么这个查询要快得多?

因为我们可以在列上轻松使用indices。在上面的模式中,Persons.PersonId和Categories.CategoryId是其表的 PRIMARY KEY 列。因此,将它们用作 JOIN 操作的列具有最低成本。 PersonCategories表的两列都是 FOREIGN KEYS (确保有效的数据库状态并提高性能)。最后,Categories.Name列也有一个 INDEX

这种方法可能不好吗?

在大多数情况下,这是要走的路。不这样做的一个原因是,如果你必须处理大量的INSERTS。此模式中的INSERTS具有更高的成本,因为所有索引都需要在INSERTS之后更新。