【问题标题】:How can I select using an intersection of comma-separated value?如何使用逗号分隔值的交集进行选择?
【发布时间】:2026-01-27 22:30:01
【问题描述】:

我有一列包含逗号分隔的值。

1,2,3
4,6,7
2,3,8
12234,5467,232445,232455,11223

使用给定的数组标准(例如,1,4,9),

如何选择值包含任何给定值的行?

我的意思是当我得到1,4,9时,我需要选择

1,2,3 -- has 1
4,6,7 -- has 4

更新

我有一个表,其中有一列以逗号分隔的其他实体主键的值。 我理解原始表设计者这样做的原因。 other 实体实际上驻留在其他数据库中,这意味着不可连接。或者他或她只是想这样做。

学生表

id     name     classes
---------------------------
1      John     1,2,3
2      Jane     2,8,233423423

标准

使用给定的以逗号分隔的班级编号,找到正在上课的学生。

given: 1           -> select John
given: 233423423   -> select Jane
given: 1,233423423 -> select Both

【问题讨论】:

  • 您的列是否仅包含一位数字,或者它们也可以是 2 位或更多位?
  • @PoorviNigotiya 任何规模的 id,谢谢。
  • 请提供更多上下文,例如所涉及表的createt table ... 行。你用的是哪种数组?
  • @Yunnosch 我想但我不知道怎么做。
  • 您对下面的答案满意吗?它对数组中的每个数字使用一个硬编码查询行。或者你有某种技术阵列?也许这些数字在单独的表格中?

标签: mysql sql


【解决方案1】:

您可以将动态模板用于正则表达式。例如:

SET @Criteria='1,4,9';
SELECT `name` 
FROM STUDENT 
WHERE STUDENT.classes REGEXP concat('(^|,)(', REPLACE(@Criteria, ',', '|'), ')(,|$)');

【讨论】:

  • 基本思想是好的。但您需要避免部分匹配的误报:REGEXP concat('(^|,)(',REPLACE(@MySet, ',', '|'),')(,|$)')
【解决方案2】:

如果您有一个输入 1,4,9 并且您必须在逗号分隔的列表中查找出现 1、4 或 9 中的任何一个的行?

SELECT ...
FROM MyTable
WHERE FIND_IN_SET(1, mycolumn) 
OR FIND_IN_SET(4, mycolumn) 
OR FIND_IN_SET(9, mycolumn)

有关此功能的信息,请参阅https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_find-in-set

这应该向您说明,当您希望将列表的元素视为离散值时,存储逗号分隔的列表对于关系数据库来说不是一个好主意。

另见我对Is storing a delimited list in a database column really that bad?的回复

【讨论】:

  • OP 的附加信息比你的答案年轻,但现在你似乎偏离了目标。
最近更新 更多