【问题标题】:How to fetch record on the basis of any one value from the column of two comma separated values如何根据两个逗号分隔值的列中的任何一个值获取记录
【发布时间】:2015-09-24 13:32:31
【问题描述】:

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

我的数据库中有一个下表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 记录。 这个怎么做。 请帮忙

【问题讨论】:

    标签: c# sql asp.net


    【解决方案1】:

    就像 Kiss Lá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 毫秒才能返回。使用上面的模式,以下查询在大约 1 毫秒内执行

    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 之后更新。

    【讨论】:

      【解决方案2】:
      select * from User where Category LIKE '%Senior Citizen%'
      

      但您应该为类别使用单独的表。

      【讨论】:

        【解决方案3】:

        你需要LIKE运营商:-

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

        【讨论】:

          【解决方案4】:

          试试这个:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-09
            • 2022-06-23
            • 2017-08-28
            • 2013-08-19
            • 2013-01-26
            • 1970-01-01
            相关资源
            最近更新 更多