如何根据两个逗号分隔值的列中的任何一个值获取记录

Posted

技术标签:

【中文标题】如何根据两个逗号分隔值的列中的任何一个值获取记录【英文标题】: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 记录。 这个怎么做。 请帮忙

【问题讨论】:

【参考方案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%'

【讨论】:

以上是关于如何根据两个逗号分隔值的列中的任何一个值获取记录的主要内容,如果未能解决你的问题,请参考以下文章

包含逗号分隔值的列中的值

如何在 Amazon Redshift 的列中取消嵌套/展开/展平逗号分隔值?

如何根据oracle plsql中列中的逗号分隔值拆分选择查询行

如何根据列中的逗号分隔值进行选择

如何在laravel中使用逗号分隔值的列上使用'where'

匹配列中的逗号分隔值